C# 如何从控制台应用程序中的Task.WaitAll()获取返回值?

C# 如何从控制台应用程序中的Task.WaitAll()获取返回值?,c#,.net,task-parallel-library,console-application,async-await,C#,.net,Task Parallel Library,Console Application,Async Await,我正在使用一个控制台应用程序作为概念证明,并且需要获得一个异步返回值 我发现我需要在main方法中使用Task.WaitAll(),以避免需要异步的“main()”方法,这是非法的 我现在一直在试图找出一个重载,该重载允许我使用泛型或只返回一个可以强制转换的对象,但在Main()中时。您无法从任务中获得返回值。WaitAll。您只能使用它来等待多个任务的完成,然后从任务本身获取返回值 var task1 = GetAsync(1); var task2 = GetAsync(2); Task.W

我正在使用一个控制台应用程序作为概念证明,并且需要获得一个异步返回值

我发现我需要在main方法中使用
Task.WaitAll()
,以避免需要异步的“main()”方法,这是非法的


我现在一直在试图找出一个重载,该重载允许我使用泛型或只返回一个可以强制转换的对象,但在Main()中时。

您无法从
任务中获得返回值。WaitAll
。您只能使用它来等待多个任务的完成,然后从任务本身获取返回值

var task1 = GetAsync(1);
var task2 = GetAsync(2);
Task.WaitAll(task1, task2);
var result1 = task1.Result;
var result2 = task2.Result;
如果只有一个
任务
,只需使用
结果
属性即可。如果任务尚未完成,它将返回您的值并阻止调用线程:

var task = GetAsync(3);
var result = task.Result;


在异步任务上同步等待(阻塞)通常不是一个好主意(“通过异步同步同步”),但我想这对POC来说很好。

要获得最佳实践,请使用新的异步方式。 而不是

  • Task.WaitAll
    使用
    wait Task.whalll
  • Task.WaitAny
    使用
    waittask.WhenAny
上述代码可以写成:

var task1 = GetAsync(1);
var task2 = GetAsync(2);
var results = await Task.WhenAll(task1, task2);
var result1 = results[0];
var result2 = results[1];

这将强制此代码所在的方法具有async关键字和任务的返回类型。Task.WaitAll将允许您返回void。我不是说这是否更好。你应该避免返回任务void。
Task.WaitAll
要求所有任务都具有相同的返回类型。作为本讨论的更新,请参阅:你不应该说“代替”,因为有时我们希望异步阻塞而不是非非阻塞
wait
刚刚使线程非阻塞。不确定
Task.WaitAll()
的实现是否发生了更改,但这个答案对我不起作用
Task.WaitAll()
只会阻塞线程,执行永远不会到达下一行。正如在其他回答中所建议的那样,执行
等待任务。当所有()
似乎是建议的前进方式时。@AdrianHristov未发生任何更改,您的代码中可能只有
同步上下文
死锁。正如这个答案所说,阻止一个异步任务不是一个好主意,但是如果你决定这样做,这就是你获得任务结果的方式。我看不出这两者之间的区别:for(var I=0;I<100;I++){taskList.Add(client.PostAsync(“);}wait task.whalll(taskList);foreach(taskList中的var task){System.Diagnostics.Debug.WriteLine(task.Result);}我在获取task.Result时出错,因为task上没有Result属性或方法?@KevinBurton对于任务的返回类型,可以使用Wait()[或重载之一]。对于任务的返回类型,其中t是返回类型,可以使用Result。