Invoke的用法


在多線程編程中,我們經常要在工作線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的做法,多個線程對一個變量同時訪問是非常危險的

所以在編程中我們可以只用Invoke 和 BeginInvoke 來解決這個問題,使多線程中安全的更新界面顯示。

正確的做法是將工作線程中涉及更新界面的代碼封裝為一個方法,通過 Invoke 或者 BeginInvoke 去調用,兩者的區別就是一個導致工作線程等待,而另外一個則不會。

在編程中,由於界面的更新是很頻繁的,所以應盡可能的吧操作對丟給工作線程,盡量讓更新界面的UI線程工作量變少

 
下面說明BeginInvoke的用法
更新窗體中的TextBox..
 
思路:在主窗口中定義一個委托,其他線程需要進行界面更新的操作時就調用這個委托

如果要在子線程中創建其他窗體,也應該有UI線程來創建,方法類似 

namespace test
{
    public partial class Form1 : Form
    {

        //定義一個委托
        public delegate void MyInvoke(string str1,string str2);
        public Form1()
        {
            InitializeComponent();
        }

        public void DoWork()
        {

            //實例化委托
            MyInvoke mi = new MyInvoke(UpdateForm);

            //啟動委托,讓主線程執行操作
            this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
        }
        public void UpdateForm(string param1,string parm2)
        {
            this.textBox1.Text = param1+parm2;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(DoWork));
            thread.Start();
        }
    }
}

 
下面做法是不可取的,不能再多個線程訪問同一個變量
//啟動一個線程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();

//線程方法
private void DoWork()
{
    this.TextBox1.Text="我是一個文本框";
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM