【问题标题】:Why await MethodName is working different from await Task.Run?为什么 await MethodName 的工作方式与 await Task.Run 不同?
【发布时间】:2016-08-20 02:49:28
【问题描述】:

您将在下方看到控制台应用代码。我尝试了两种情况。在第一种情况下,我评论了 await GetProducts() 行。在这种情况下,输出为:

开始时间:13:20:30 工作开始... 结束时间:13:20:30 任务完成...

在第二种情况下,我打开了 await GetProducts 行并注释了 await Task.Run...行。在这种情况下,输出为:

开始时间:13:19:33 工作开始... 作业完成... 结束时间:13:19:43

这是代码行...有什么区别? 谢谢...

class Program
{
    static void Main(string[] args)
    {
        Task x = LoadProductsAsync();

        Console.Read();
    }


    private static async Task LoadProductsAsync()
    {
        Console.WriteLine("Start Time: "  + DateTime.Now.ToLongTimeString());

        //await GetProducts();

        await Task.Run(() =>
        {
            GetProducts();
        });

        Console.WriteLine("Finish Time: " + DateTime.Now.ToLongTimeString());
    }

    private static Task<List<Product>> GetProducts()
    {
        return Task.Factory.StartNew(
            () => GetProductsByCategory()
        );
    }

    private static List<Product> GetProductsByCategory()
    {
        Console.WriteLine("Job started...");

        System.Threading.Thread.Sleep(10000);

        Console.WriteLine("Job finished...");

        return new List<Product>();

    }
}

【问题讨论】:

标签: c# asynchronous async-await


【解决方案1】:

这就是问题所在:

await Task.Run(() =>
{
    GetProducts();
});

您不是在等待 GetProducts() 返回的任务完成 - 您只是在等待立即的 GetProducts() 方法调用完成。

最简单的解决方法是改用方法组转换,并调用Task.Run&lt;TResult&gt;(Func&lt;Task&lt;TResult&gt;&gt;)

await Task.Run(GetProducts);

那么Task.Run返回的任务将是GetProducts()返回的任务的代理任务,所以await表达式直到GetProducts真正完成后才会完成。

【讨论】:

  • 我认为,我的版本对 Web 应用程序非常有用。考虑一个网页,它以 form_load 方法从数据库中加载大型数据集。在这种情况下,页面等待数据库操作。但是在我的版本中,可以在不获取数据集的情况下显示页面。我说的对吗?
  • @qwerty:不是真的——你没有任何地方可以得到结果。如果你想在页面之后加载数据,你可以在客户端使用 Javascript。
【解决方案2】:

将您的代码更改为下面的片段。你的代码也是一样的。

await Task.Run(() =>
    {
        GetProductsByCategory();
    });

你最后的代码是这样的(你在任务中运行任务):

await Task.Run(() =>
    {
        return Task.Factory.StartNew(
            () => GetProductsByCategory()
        );
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多