码迷,mamicode.com
首页 > 编程语言 > 详细

C#异步调用,成功回调中更新界面(线程间操作无效)

时间:2021-04-22 15:25:20      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:success   sync   ui线程   组件   访问   htm   return   main   question   

一、异步更新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://apis.100xlg.cn/apis/index.php?action=main").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

 

C#异步调用,成功回调中更新界面(线程间操作无效)

标签:success   sync   ui线程   组件   访问   htm   return   main   question   

原文地址:https://www.cnblogs.com/fps2tao/p/14683435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!