1. 程式人生 > >C# 多執行緒與委託的疑惑 InvokeRequired==true or false

C# 多執行緒與委託的疑惑 InvokeRequired==true or false

我們經常會碰到跨執行緒訪問的問題,這時候可行的辦法就是用委託,但是最近在用到委託的時候,發現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一下吧!