Ete*_*l21 -2 c# task-parallel-library
假设我有两个任务,具有以下要求:
我提出了以下代码,但它只是在两个任务开始后挂起(WaitAny函数永远不会返回).我在Run函数下也得到了一条波浪线,告诉我在其中添加await,但当我尝试在Task.WaitAny前面添加它时,VS会抱怨.我应该在另一个任务中包装WaitAny吗?我究竟做错了什么?
async void Run()
{
Task task1 = Task1();
Task task2 = Task2();
int completedTaskIdx = Task.WaitAny(task1, task2);
Debug.WriteLine("completedTaskIdx = {0}", completedTaskIdx.ToString());
}
async Task Task1()
{
Debug.WriteLine("Task 1 Start");
await Task.Delay(5000);
Debug.WriteLine("Task 1 Stop");
}
async Task Task2()
{
Debug.WriteLine("Task 2 Start");
await Task.Delay(10000);
Debug.WriteLine("Task 2 Stop");
}
Run Code Online (Sandbox Code Playgroud)
使用asnyc/await时不要阻止UI线程,否则会导致dedlocks.你的WaitAny()原因让你陷入僵局.使用WhenAny替代,您可以使用Array.IndexOf(返回的任务转换回在到索引中.
async Task Run()
{
Task task1 = Task1();
Task task2 = Task2();
var tasks = new[] {task1, task2};
Task completedTask = await Task.WhenAny(tasks);
//It is a good idea to await the retuned task, this is the point a execption would
//be raised if the task finished with a exception.
await completedTask;
int completedTaskIdx = Array.IndexOf(tasks, completedTask);
//.ToString() will cause you to have a bug, you are calling the
//wrong overload of WriteLine. The correct overload will call .ToString() for you.
Debug.WriteLine("completedTaskIdx = {0}", completedTaskIdx);
}
Run Code Online (Sandbox Code Playgroud)
我还修正了一个错误在你的Debug.WriteLine(电话,你在哪里调用此重载当你想要这个过载.我也换成你async void带async Task,你不应该这样做asnyc void,除非你用它来匹配事件处理程序的签名.