这两种方法有什么区别:
public static int Main(string[] args)
{
string result;
Task.Run(async () =>
{
Task<string> getStringTask = GetStringAsync();
result = await validationsTask;
}).Wait();
Console.WriteLine(result);
}
和
public static int Main(string[] args)
{
Task<string> getStringTask = GetStringAsync();
getStringTask.Wait();
string result = getStringTask.Result;
Console.WriteLine(result);
}
我见过很多人使用第一种方法,但我不确定为什么。有什么特别的优势吗?建议在控制台应用程序的主要内部等待异步方法使用哪一个?
最佳答案
Is there any particular advantage?
通常使用 async
方法,操作被同步初始化,然后等待可以与 await
异步或与 Wait()
同步。 Main
方法不能是 async
,因此您必须在那里用 Wait()
强制阻塞,或者您可以执行 Console。 ReadKey()
运行直到用户按下一个键。
Task.Run(async () => ... )
在 async
操作的初始化成本很高时非常有用。这样您就可以在操作初始化时允许主线程继续。
Which one is recommended for waiting async methods inside main of a Console Application?
我会使用第二种方法的略微修改版本。您可以添加一个 MainAsync
方法并从 Main
调用它,然后您可以在其中使用 await
。
public static async Task MainAsync()
{
string result = await GetStringAsync();
Console.WriteLine(result);
}
public static int Main(string[] args)
{
MainAsync().Wait();
}
对于控制台应用程序,也没有死锁的风险,因为没有 SynchronizationContext
并且使用默认线程池。
关于c# - 什么时候应该使用 Task.Run()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620572/