【发布时间】:2018-10-13 21:29:05
【问题描述】:
假设我有一个异步方法,它使用实体框架从数据库中获取内容。例如:
public async Task<MyEntity> Get(string bar){
return await db.MyEntities.Where(x=>x.Foo==bar).SingleOrDefaultAsync();
}
这主要由异步 MVC 或 Web API 控制器使用,并且工作正常。但也许我偶尔也想在没有异步方法的控制台应用程序中使用它。我可以通过使用Task.Run来做到这一点
private static async Task MainAsync()
{
using(MyEntityService repo=new MyEntityService())
{
MyEntity myEntity=await repo.Get("foobar");
//do stuff
}
}
public static void Main()
{
Task.Run(async () =>
{
await MainAsync();
}).Wait();
}
我的问题是:与实现Get 方法的非异步版本相比,这样做是否有缺点?假设我对这种级别的代码复杂性感到满意,是否存在非异步方法可能更好的性能原因?
【问题讨论】:
-
知道使用 C# 7.1 及更高版本您可以拥有
async Main。 -
你为什么在
Main中使用Task.Run? -
Task.Run()没有功能。只需致电MainAsync().Wait();。通常不行,但这是 Main() 所以你被允许了。 -
而
async Task Main()只是装点门面,它只会将.Wait()移动到你看不到的地方。
标签: c# entity-framework async-await