为什么等待MethodName与等待Task.Run不同?

时间:2016-04-26 10:23:36

标签: c# asynchronous async-await

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

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

在第二种情况下,我打开等待GetProducts行并注释等待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>();

    }
}

2 个答案:

答案 0 :(得分:6)

这是问题所在:

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

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

最简单的解决方法是使用方法组转换,然后调用Task.Run<TResult>(Func<Task<TResult>>)

await Task.Run(GetProducts);

然后Task.Run返回的任务将成为GetProducts()返回的任务的代理任务,因此在await真正完成之前GetProducts表达式将无法完成

答案 1 :(得分:-2)

将您的代码更改为下面的snnipet。你的代码也一样。

426 data connection closed, SSL/TLS negotiation failed

您的上一个代码就像(您在任务中运行任务):

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