线程:应用程序在使用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冻结。我如何在后台线程中实现这些?你们觉得我应该改什么?

线程:应用程序在使用Thread.Join()后冻结

如果你正在使用。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