![](/img/trans.png)
[英]Task.Run( () MethodName()) and await Task.Run(async () => MethodName())
[英]Why await MethodName is working different from await Task.Run?
您将在下面看到控制台应用程序代码。 我试过两种情况。 在第一种情况下,我评论了等待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>();
}
}
这就是问题:
await Task.Run(() =>
{
GetProducts();
});
您不是在等待GetProducts()
返回的任务完成 - 您只是等待立即GetProducts()
方法调用完成。
最简单的解决方法是使用方法组转换,并调用Task.Run<TResult>(Func<Task<TResult>>)
:
await Task.Run(GetProducts);
然后, Task.Run
返回的任务将是GetProducts()
返回的任务的代理任务,因此在GetProducts
真正完成之前, await
表达式将无法完成。
将您的代码更改为下面的snnipet。 你的代码也是一样的。
await Task.Run(() =>
{
GetProductsByCategory();
});
你的上一个代码就像(你在任务中运行任务):
await Task.Run(() =>
{
return Task.Factory.StartNew(
() => GetProductsByCategory()
);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.