创建线程
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);
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/program/cs-thread.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)