需求:
有A,B两个任务,A任务比较耗时,但是B任务要等待A任务执行结果再去执行,要求不阻塞主线程;
考虑Task实现。
解决方案一:
首先比较容易想到的方法是:
public void GetNumberAsyncUseTask()
{
Task.Run(() =>
{
Task<bool> task = Task.Run(() =>
{
//A任务
Thread.Sleep(5000);
return false;
});
//B任务
if (task.Result)
{
MessageBox.Show($"task over :{task.Result}");
}
else
{
MessageBox.Show($"task over :{task.Result}");
}
});
}
开一个线程去按顺序执行,符合要求;
单独尝试Task.Result来等待:
public void GetNumberAsyncButChokeUp()
{
Task<bool> task = Task.Run(() =>
{
Thread.Sleep(5000);
return false;
});
//会阻塞主线程
if (task.Result)
{
MessageBox.Show($"task over :{task.Result}");
}
//同样会阻塞
//task.Wait();
//MessageBox.Show($"task over :{task.Result}");
}
发现会造成主界面假死状态,Task.Wait()也会造成主界面假死;
解决方案二:
使用Task.ContinueWith:
public void GetNumberContinueWith()
{
Task<bool> task = Task.Run(() =>
{
Thread.Sleep(5000);
return false;
});
//不会阻塞
task.ContinueWith((t) =>
{
Thread.Sleep(100);
if (t.Result)
{
MessageBox.Show($"task over :{task.Result}");
}
else
{
MessageBox.Show($"task over :{task.Result}");
};
});
解决方案三:
或者await:
public async void GetNumberAsync()
{
Task<bool> task = Task.Run(() =>
{
Thread.Sleep(5000);
return false;
});
//不会阻塞
await task;
if (task.Result)
{
MessageBox.Show($"task over :{task.Result}");
}
else
{
MessageBox.Show($"task over :{task.Result}");
};
}