C#初学点滴-关于在异步操作中更新主线程控件的问题

在使用异步操作的时候不要直接调用不是它创建的变量。

一般的控件(按钮、文本框…)都会在一个Form中通过“设计”视图来加入,这种控件一般都是由主线程产生的。在使用异步操作时,有时候会更新这些控件(如读取文件时更新进度),可是直接在异步操作中使用不是它产生的控制是不允许的,如下:

// label1是由主线程产生的
label1.Text = "Start";  // 没问题
//...do something

// 以下方法由 异步操作调用(非主线程)
void fun1()
{
    label1.Text = "Finish";   // 这是不允许的
}

需要更新主线程里的控制,有二种方法(目前我所学习到的)

1、在异步操作开始的时候声明:

Form.CheckForIllegalCrossThreadCalls = false;
2、使用控件的Invoke方法:
控件的Invoke方法大概意思是先停止当前的线程,返回主线程执行,执行完成后再回到当前线程。
// 以下语句在异步操作中执行
object[] args = { this, System.EventArgs.Empty };
webBrowser1.Invoke(new System.EventHandler(SubmitForm), args);

// 以下方法就可以安全的操作主线程的控件了
        private void SubmitForm(object o, System.EventArgs e)
        {
            //Thread.CurrentThread.IsBackground = false;
            //MessageBox.Show("Go here");
            HtmlElement submit = MyForm.webBrowser1.Document.GetElementById("postsubmit");
            //MessageBox.Show(MyForm.webBrowser1.DocumentText.ToString());
            submit.InvokeMember("Click");
            FindLoutStop();
            MessageBox.Show("完成");
        }
第一种方法应该避免使用,使用第二种方法是明智选择。