C#如何在任务中捕获任务结果。何时&引用;。“结果”;或;等待“;

C#如何在任务中捕获任务结果。何时&引用;。“结果”;或;等待“;,c#,.net,asynchronous,async-await,task,C#,.net,Asynchronous,Async Await,Task,我需要使用Task.WhenAll同时运行3个或更多任务,一旦Task.WhenAll执行完所有任务,我要捕获所有任务的结果 如何获得使用Task.WhenAll执行的那些任务的结果 我应该使用.Result还是wait?为什么 .Result会被阻塞吗 以下是代码示例: var task1 = Task1(); var task2 = Task2(); var task3 = Task3(); await Task.WhenAll(task1, task2, task3); // 1st

我需要使用Task.WhenAll同时运行3个或更多任务,一旦Task.WhenAll执行完所有任务,我要捕获所有任务的结果

如何获得使用Task.WhenAll执行的那些任务的结果

我应该使用
.Result
还是
wait
?为什么

.Result
会被阻塞吗

以下是代码示例:

var task1 = Task1();
var task2 = Task2();
var task3 = Task3();

await Task.WhenAll(task1, task2, task3);

// 1st approach:
var result1 = task1.Result;
var result2 = task2.Result;
var result3 = task3.Result;

// 2nd approach:
var result1 = await task1;
var result2 = await task2;
var result3 = await task3;

假设您希望完成所有三项工作,并且它们都不依赖于另一项,那么在启动它们之后,使用
Task.WhenAll()
和/或
分别等待它们。你不一定需要两者都用

var task1=task1();
var task2=task2();
var task3=task3();
异步方法总是同步开始运行。因此,当您调用
Task1()
时,它将一直运行,直到对未完成的
任务执行操作的第一个
wait
。当它开始等待您发出的任何I/O请求时。此时,
Task1()

这是对资源的最佳利用,因为您使用在
Task1()
中等待响应的时间来启动
Task2()
中的下一个请求,等等

如果使用
wait Task.whalll
,则当前线程将被释放以执行其他工作。这三个任务很可能在完成等待(取决于几件事情)后在当前线程上继续执行,一个接一个,以各自请求完成的顺序进行。一旦它们都完成了,执行将在
等待任务之后进入下一行

这:

var result1=wait task1;
var result2=等待任务2;
var result3=等待任务3;
非常类似于执行
任务。WhenAll()
(因为您之前已经启动了任务)。但在这里,您将捕获从每种方法返回的结果。如果您需要使用结果,那么您应该使用这个

如果在
wait task1
之前使用
Task.WhenAll()
,则在开始使用
task1
的结果之前,您将等待这三个任务全部完成。如果可以在其他任务完成之前使用
task1
的结果,则无需使用
Task.WhenAll()

这:

var result1=task1.Result;
var result2=task2.Result;
var result3=task3.Result;

将阻止当前线程,直到
task1
完成。如果任务需要在当前上下文中恢复,那么很可能会出现死锁。有关原因的解释,请参见此处:

。。。或者没有任务的第二次进近。当所有
时,第二次进近的1 LOC小于第一次进近的1 LOC时,您如何定义“最佳”?
。除非任务已在该点解决,否则结果
是阻塞的。其他一切都只是业务逻辑需要什么的问题。任务可以并发运行,也可以按顺序运行。选择适合需要的选项。@Selvin但这样我们就不会从并发执行任务中获益