• 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("完成");
            }
    第一种方法应该避免使用,使用第二种方法是明智选择。
  • 相关阅读:
    java实现扑克牌排列
    java实现扑克牌排列
    java实现扑克牌排列
    java实现扑克牌排列
    java实现扑克牌排列
    java实现平面点最小距离
    java实现平面点最小距离
    java实现拍7游戏
    java实现拍7游戏
    using_where, Using temporary ,using_filesort 分享
  • 原文地址:https://www.cnblogs.com/openusb/p/1656017.html
Copyright © 2020-2023  润新知