zoukankan      html  css  js  c++  java
  • C#多线程下更新UI的几种方法

    1. 使用UI线程的SynchronizationContext的Post/Send方法,这种情况一般在窗体构造函数或者FormLoad中获取同步上下文

    范例:

     public partial class Form1 : Form
        {
            SynchronizationContext SyncContext = null;
            public Form1()
            {
                InitializeComponent();
                //获取UI线程同步上下文
                SyncContext = SynchronizationContext.Current;
            }
            private void btnOk_Click(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(d=> {
                    //模拟耗时操作
                    Thread.Sleep(1000);
                    SyncContext.Post(m => {
                        var result = m as string;
                        txtName.Text = result;
                    }, "异步操作完成结果");
                });
            }
        }
    
    public partial class Form1 : Form
        {
            SynchronizationContext SyncContext = null;
            public Form1()
            {
                InitializeComponent();
                //获取UI线程同步上下文
                SyncContext = SynchronizationContext.Current;
            }
            private void btnOk_Click(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(d=> {
                    //模拟耗时操作
                    Thread.Sleep(1000);
    
                    SyncContext.Send(m =>
                    {
                        var result = m as string;
                        txtName.Text = result;
                    }, "异步操作完成结果2");
                });
            }
        }
    

    2、使用Control的Invoke/BegainInvoke方法更新;

    范例:

     public partial class Form1 : Form
        {
           // SynchronizationContext SyncContext = null;
            public Form1()
            {
                InitializeComponent();
                //获取UI线程同步上下文
                //SyncContext = SynchronizationContext.Current;
            }
            private void btnOk_Click(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(d=> {
                    //模拟耗时操作
                    Thread.Sleep(1000);
    
                    if (txtName.InvokeRequired)
                    {
                        txtName.Invoke(new Action<Control, string>((ctrl, data) => {
                            ctrl.Text = data;
                        }), new object[] { txtName, "异步操作完成结果3" });
                    }
                    else
                    {
                      txtName.Text = "异步操作完成结果3";
                    }
                });
            }
        }
  • 相关阅读:
    损失函数
    DPM 目标检测1
    编程题
    枚举型和元类
    python 多继承
    网络基础Cisco路由交换一
    网络基础tcp/ip协议五
    网络基础tcp/ip协议四
    网络基础tcp/ip协议三
    网络基础tcp/ip协议二
  • 原文地址:https://www.cnblogs.com/weicanpeng/p/7885421.html
Copyright © 2011-2022 走看看