C# 多執行緒與委託的疑惑 InvokeRequired==true or false
阿新 • • 發佈:2018-12-09
我們經常會碰到跨執行緒訪問的問題,這時候可行的辦法就是用委託,但是最近在用到委託的時候,發現InvokeRequired的值在程式執行過程中會變來變去的,我本來以為這個是一個定值,當InvokeRequired值為true的時候,就說明現在遇到跨執行緒訪問了,那下面就需要用到委託,但是在設定斷點檢視InvokeRequired的值,發現在第一個斷點處,InvokeRequired值為true,如下圖所示
繼續往下執行,到達第二個斷點,發現這時候InvokeRequired值為false
需要新增兩個texbox和一個button,程式碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace winFormAddMulti { public delegate void setPos();//定義委託 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Add_Click(object sender, EventArgs e) { Thread thread_add = new Thread(new ThreadStart(doAdd)); thread_add.Start(); } public void doAdd()//該方法是執行在一個輔助執行緒上,顯示結果的textbox是屬於主執行緒的,因此,如果該輔助執行緒 //要將資料返回到textbox裡面,這就涉及到了跨執行緒訪問的問題 { System.Threading.Thread.Sleep(500); if (this.InvokeRequired)// { setPos setpos = new setPos(doAdd);//委託例項化,例項為setpos,並且指定了在該委託上將要執行的方法doAdd this.Invoke(setpos); } else { int readingNum = Convert.ToInt32(textBox1.Text);//首先讀取主執行緒UI介面中textbox1中的整數 int numShow = AddNumbers(readingNum);//計算該整數累加的結果 this.textBox3.AppendText(numShow.ToString());//將結果返回到主執行緒的UI介面中的textbox3 } } public int AddNumbers(int num) { checked { int temp_add = 0; int i = 0; for (; i < num + 1; i++) { temp_add = temp_add + i; //this.progressBar1.Value = Convert.ToInt32(i*100/num); //this.label3.Text=i.ToString()+"\r\n"; } return temp_add; } } } }
出現這種狀況的原因尚不清楚,可能是對跨執行緒訪問和代理的理解還不夠,先mark一下吧!