zoukankan      html  css  js  c++  java
  • C#异步调用,成功回调中更新界面(线程间操作无效)

    一、异步更新UI线程--利用委托

    C#异步调用,界面假死加更新界面 (此例子更新界面的方法是利用组件的委托方法Control.Invoke())

    lblStatus.Text = "执行中,请稍候……";
      
    Func<int> longTask = new Func<int>(delegate()
    {
        //  模拟长时间任务
        Thread.Sleep(2000);
      
        //  返回任务结果:5
        return 5;
    });
    //  发起一次异步调用,实际上就是在.net线程池中执行longTask
    //  这时由于是其它线程在工作,UI线程未被阻塞,所以窗体不会假死
    longTask.BeginInvoke(ar =>
    {
        //  使用EndInvoke获取到任务结果(5)
        int result = longTask.EndInvoke(ar);
      
        //  使用Control.Invoke方法将5显示到一个label上,如果没有Invoke,
        //  直接写lblStatus.Text="5",将会抛出跨线程访问UI控件的异常
        Invoke(new Action(() => lblStatus.Text = "执行结果是:" + result));
    }, null);

    再举一个例子:

            private delegate void InvokeCallBackDelegate();
            private void btn_click01_Click(object sender, EventArgs e)
            {
                txt_html.Text = "";
                this.btn_click01.Enabled = false;
                //使用的httpLib库:jthorne.co.uk/httplib.
                Http.Get("http://www.baidu.com").OnSuccess(result =>
                {
                     //下面是返回给界面信息提示
                        this.Invoke(new InvokeCallBackDelegate(delegate ()
                        {
                            txt_html.Text = result;
                            this.btn_click01.Enabled = true;
                        }));
    
                }).Go();
            }

    二、异步更新UI线程--利用同步模型中转播上下文

             
            private void btn_http_Click(object sender, EventArgs e)
            {
                SynchronizationContext _uiContext1 = SynchronizationContext.Current;//上下文内容(变量可以作为属性,在窗口实例化时赋值)
                txt_html.Text = "";
                this.btn_http.Enabled = false;
                //使用的httpLib库:jthorne.co.uk/httplib.
                Http.Get("http://www.baidu.com").OnSuccess(result =>
                {
                    //若你在业务处理方法内需要对界面控件进行操作就需要这样更新
                    _uiContext1.Post(_ =>
                    { 
                        txt_html.Text = result;
                        btn_http.Enabled = true;
                    }, null);
                }).Go();
            }

    转 ; 

    https://blog.csdn.net/guo449211721/article/details/81262057

    https://zhidao.baidu.com/question/314987513.html

  • 相关阅读:
    Redis 存储字符串和对象
    深入理解Java中的final关键字
    Redis缓存Object,List对象
    JVM最多能创建多少个线程: unable to create new native thread
    Java中如何使用Redis做缓存
    Fiddler抓包11-HTTPS证书Actions无法导出问题
    Fiddler抓包10-会话框添加查看get与post请求类型
    python接口自动化10-token登录
    python接口自动化9-https请求(SSL)
    python爬虫beautifulsoup4系列4-子节点
  • 原文地址:https://www.cnblogs.com/fps2tao/p/14683435.html
Copyright © 2011-2022 走看看