线程:应用程序在使用Thread.Join()后冻结
本文关键字:Join 冻结 Thread 应用程序 线程 | 更新日期: 2023-09-27 17:49:27
我理解。join()导致线程暂停并等待直到线程完成其工作,但我如何避免UI被冻结?这就是我的代码的样子"
Thread dataThread = new Thread(()=> data = getData(id));
dataThread.Start();
dataThread.Join();
Thread storingThread = new Thread(()=> storeData(data));
storingThread.Start();
我需要Join,因为第一个线程返回一个对象,其中包含需要通过第二个线程存储的数据。但这会导致UI冻结。我如何在后台线程中实现这些?你们觉得我应该改什么?
如果你正在使用。net framework>= 4.5,你可以使用Tasks
await Task.Run(() => data = getData(id));
await Task.Run(() => storeData(data));
或在一个命令
await Task.Run(() => storeData(getData(id)));
如果你不需要等到它完成,你也可以这样做:
Task.Run(() => storeData(getData(id)));
似乎你不需要两个线程:
Thread dataThread = new Thread(() => storeData(getData(id)));
dataThread.Start();
注意,Task
优于Thread
。此外,您可能应该使用await.
答案已经给出了。作为额外的奖励,我把我的给你。
你也可以像这样使用ContinueWith:
Task<string>.Factory.StartNew(() => "Hey!").ContinueWith(t => Console.WriteLine(t.Result));
将所有工作放到一个线程中,这样UI就不会停止:
ThreadPool.QueueUserWorkItem( () => storeData(getData(id)));
或。net 4
Task.Factory.StartNew(() => storeData(getData(id)));
使用async/await关键字。小示例代码:
private async void Method()
{
var result = await ExecuteAsync();
// result == true
}
private async Task<bool> ExecuteAsync()
{
//run long running action
return true;
}
在。net 4.0中,您需要安装Microsoft.Bcl.Async
才能使用此功能。
关于这个特性的一个很好的介绍可以在http://blog.stephencleary.com/2012/02/async-and-await.html