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