c# - 为什么 await MethodName 的工作方式与 await Task.Run 不同?

标签 c# asynchronous async-await

您将在下方看到一个控制台应用程序代码。我试过两种情况。在第一种情况下,我评论了 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>();

    }
}

最佳答案

问题是:

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

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

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

await Task.Run(GetProducts);

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

关于c# - 为什么 await MethodName 的工作方式与 await Task.Run 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862149/

相关文章:

c# - Excel COM 互操作 - 为什么返回类型通常是动态的?

c# - 服务器标记不能包含 <% ... %> 结构

javascript - 错误 : property 'subscribe' does not exist on type 'OperatorFunction<{}, {} |可观察<任意>>

python - 组合像 Promise.all 这样的等待对象

c# - 访问处置关闭

javascript - Angular - 从服务发送请求比从组件发送请求更好?

c# - WPF 数据网格 : field value in Edit mode not available outside row

c# - 添加的图表系列点与 X 轴不同步

javascript - 使用 React Router PrivateRoute 处理 Refreshtoken

python - Twisted 服务器,从 Twitter 流 api 消费并同时提供静态内容