C#中Invoke和BeginInvoke區(qū)別小結
本文導讀:BeginInvoke() 調用時,當前線程會啟用線程池中的某個線程來執(zhí)行此方法,當前線程不被阻塞,繼續(xù)運行后面的代碼, Invoke() 調用時,會阻塞當前線程,等到 Invoke() 方法返回才繼續(xù)執(zhí)行后面的代碼,而這兩個方法中執(zhí)行的是一個委托。
一、c# Invoke和BeginInvoke的認識
1、Invoke() 調用時,Invoke會阻止當前主線程的運行,等到 Invoke() 方法返回才繼續(xù)執(zhí)行后面的代碼,表現(xiàn)出“同步”的概念。
2、BeginInvoke() 調用時,當前線程會啟用線程池中的某個線程來執(zhí)行此方法,BeginInvoke不會阻止當前主線程的運行,而是等當前主線程做完事情之后再執(zhí)行BeginInvoke中的代碼內容,表現(xiàn)出“異步”的概念。
3、EndInvoke() ,在想獲取 BeginInvoke() 執(zhí)行完畢后的結果時,調用此方法來獲取。
二、通過實例說明 c# Invoke和BeginInvoke的區(qū)別
1、實例
private void button1_Click(object sender, EventArgs e) { this.textBox1.Text = "1"; this.Invoke(new EventHandler(delegate { this.textBox1.Text += "2"; })); this.textBox1.Text += "3"; }
結果為:123
2、實例
private void button1_Click(object sender, EventArgs e) { this.textBox1.Text = "1"; this.BeginInvoke(new EventHandler(delegate { this.textBox1.Text += "2"; })); this.textBox1.Text += "3"; }
結果為: 132
3、實例
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace InvokeTest { delegate void MsgDelegate(String str);//聲明一個代理 public partial class Form1 : Form { Thread[] threads = new Thread[10];//如果不使用關鍵字new出對象來,則會報“未將對象引用設置到對象的實例。”的錯誤 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread.CurrentThread.Name = "主線程"; for(int i=0;i<10;i++) { Thread ts = new Thread(new ThreadStart(threadProc)); ts.Name = "線程組成員"+i.ToString()+"號"; threads[i] = ts; ts.IsBackground = true; ts.Start(); } } private void showMsg(String str) { Thread.Sleep(5000);//線程休眠5秒... MessageBox.Show(str+"是在"+Thread.CurrentThread.Name+"中執(zhí)行的");//顯示執(zhí)行該代理函數(shù)的是哪個線程 } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("執(zhí)行A1代碼段"); Thread T1 = new Thread(threadProc1); T1.Name = "線程一"; T1.Start(); MessageBox.Show("執(zhí)行B1代碼段"); } private void button2_Click(object sender, EventArgs e) { MessageBox.Show("執(zhí)行A2代碼段"); Thread T2 = new Thread(threadProc2); T2.Name = "線程二"; T2.Start(); MessageBox.Show("執(zhí)行B2代碼段"); } /// <summary> /// 線程一的線程函數(shù) /// </summary> private void threadProc1() { Invoke(new MsgDelegate(showMsg), new object[] { "通過Invoke調用showMsg" });//相當于this.Invoke,調用要消耗較長時間的代碼后完了才開始執(zhí)行下一條語句 MessageBox.Show("Invoke函數(shù)后調用,因為Invoke是同步執(zhí)行的,所以剛才我一直在等待showMsg執(zhí)行完呢,唉..."); } /// <summary> /// 線程二的線程函數(shù) /// </summary> private void threadProc2() { BeginInvoke(new MsgDelegate(showMsg), new object[] { "通過BeginInvoke調用showMsg" });//相當于this.BeginInvoke()調用要消耗較長時間的代碼后立刻執(zhí)行下一條語句 MessageBox.Show("BeginInvoke函數(shù)后調用,但由于BeginInvoke的異步執(zhí)行,故還沒等showMsg執(zhí)行完我就被執(zhí)行了!哈哈..."); } private void threadProc() { MessageBox.Show(Thread.CurrentThread.Name+" 已經(jīng)運行!"); } } }
到此這篇關于C#中Invoke和BeginInvoke區(qū)別小結的文章就介紹到這了,更多相關C# Invoke和BeginInvoke區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#如何優(yōu)雅地取消進程的執(zhí)行之Cancellation詳解
本文介紹了.NET框架中的取消協(xié)作模型,包括CancellationToken的使用、取消請求的發(fā)送和接收、以及如何處理取消事件2024-12-12C#基于JsonConvert解析Json數(shù)據(jù)的方法實例
最近初接觸C#語言,發(fā)現(xiàn)JSON解析這塊和JAVA差異過大,下面這篇文章主要給大家介紹了關于C#基于JsonConvert解析Json數(shù)據(jù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04