C#线程及线程消息更新界面UI

2017/09/11 program 共 925 字,约 3 分钟

创建线程

Thread

new Thread(new ThreadStart(this.ThreadMethod)).Start();

// new Thread(new ThreadStart(this.ThreadMethod)).Start(param);

private void ThreadMethod() {
    //...
}

Task

new Task(() => {
	//...
}).Start();

线程池ThreadPool

ThreadPool.QueueUserWorkItem((o) => {
      //...
});  

线程通知更新UI

不能在工作线程里直接修改界面UI,否则会崩溃,出现类似的错误:

必须在与 DependencyObject 相同的线程上创建 DependencySource
  • 结合lambda表达式,代码会简洁一些。
  • 使用:Application.Current.Dispatcher.BeginInvoke 或 SynchronizationContext的Post或Send
  • 注:在UI主线程中设置UI控件;数据源关联的界面资源也需要在UI主线程设置。
  • 注:不要再用 InvokeRequired 的方式了,太蹩脚了。

方法一:

private void ThreadMethod() {
    //...
    
    ThreadPool.QueueUserWorkItem((o) => {
        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, new Action(() => {
            ImageSource i = getItemImageIndex(item);
            item.imageSource = i;
        }));
    });
    
    //...
}

方法二:

private SynchronizationContext mContext;            //UI线程同步上下文

mContext = SynchronizationContext.Current; 			//获取UI线程同步上下文

mContext.Post((o) => {
    //updateUI code..
}, param);

文档信息

Search

    Table of Contents