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

时间:2015-05-16 13:52:16

标签: c# .net multithreading .net-4.0

我知道.Join()导致线程暂停并等待线程完成其工作但是如何避免UI被冻结?这就是我的代码看起来像“

Thread dataThread = new Thread(()=> data = getData(id));
dataThread.Start();
dataThread.Join();

Thread storingThread = new Thread(()=> storeData(data));
storingThread.Start();

我需要加入,因为第一个线程返回一个包含需要通过第二个线程存储的数据的对象。但这会导致UI冻结。如何在后台线程中实现这些?你认为我应该改变什么?

5 个答案:

答案 0 :(得分:3)

您似乎不需要两个主题:

Thread dataThread = new Thread(() => storeData(getData(id)));
dataThread.Start();

请注意,Task优于Thread。此外,您可能应该使用等待。

答案 1 :(得分:3)

如果您使用.Net framework> = 4.5,则可以使用任务

await Task.Run(() => data = getData(id));
await Task.Run(() => storeData(data));

或在一个命令中

await Task.Run(() => storeData(getData(id)));

如果你不必等到它完成,你也可以这样做:

Task.Run(() => storeData(getData(id)));

答案 2 :(得分:3)

将整个工作放在一个线程中,以便用户界面不会停止:

 ThreadPool.QueueUserWorkItem( () => storeData(getData(id)));

或.Net 4

Task.Factory.StartNew(() => storeData(getData(id)));

答案 3 :(得分:2)

使用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

上阅读此功能的优秀介绍

答案 4 :(得分:1)

答案已经给出。作为额外的,我给我的。

你也可以像这样使用ContinueWith:

Task<string>.Factory.StartNew(() => "Hey!").ContinueWith(t => Console.WriteLine(t.Result));