c# - 什么时候应该使用 Task.Run()?

标签 c# asynchronous concurrency task

这两种方法有什么区别:

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/

相关文章:

php - 基于高流量百分比的集合选择?

c++ - 这个危险指针示例是否因为 ABA 问题而存在缺陷?

c# - 文本框按字符数分割文本

c# - 深层嵌套方法层次结构中的异步/等待

c# - 从 SortedList 或 SortedDictionary 获取第 i 个值

javascript - 将 asyncTest 与 for 循环一起使用

C#5 异步方法完成事件。

python - 使用 Python 的 multiprocessing.pool.map 操作同一个整数

c# - 在 Windows 8 Metro Windows Store 应用程序中合并声音文件音频和记录

c++ - 当人们谈论并发时, "transaction"是什么意思?