我知道.Join()导致线程暂停并等待线程完成其工作但是如何避免UI被冻结?这就是我的代码看起来像“
Thread dataThread = new Thread(()=> data = getData(id));
dataThread.Start();
dataThread.Join();
Thread storingThread = new Thread(()=> storeData(data));
storingThread.Start();
我需要加入,因为第一个线程返回一个包含需要通过第二个线程存储的数据的对象。但这会导致UI冻结。如何在后台线程中实现这些?你认为我应该改变什么?
答案 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));