【发布时间】:2015-09-24 23:02:06
【问题描述】:
我正在构建一个async Web Api,在阅读了一些关于async/await 的文章后,我认为我做错了什么。
这是我的实际代码:
public async Task<IHttpActionResult> GetAccount(int id)
{
var i = await GetInstanceIdAsync(User, _db); //grabs a thread
...
}
public async static Task<int> GetInstanceIdAsync(IPrincipal user, Entities db)
{
var userManager =
new UserManager<ControliUser>(new UserStore<ControliUser>(db));
//next line grabs another thread but since it was called from an await
//it holds 2 threads, am I correct?
var u = await userManager.FindByNameAsync(user.Identity.Name);
return u == null ? 0 : u.InstanceId ?? 0;
}
所以我的第一个问题是,这会消耗 2 个线程吗?
如果答案是肯定的,那么我做了这个扩展方法来防止这种情况发生。
public static Task<int?> InstanceIdAsync(this Entities db, IPrincipal user)
{
var userManager = new UserManager<ControliUser>(new UserStore<ControliUser>(db));
return userManager.FindByNameAsync(user.Identity.Name).ContinueWith(t =>
{
if (t.IsCompleted && t.Result != null)
return t.Result.InstanceId;
return null;
});
}
我认为这种方法只会消耗 1 个线程并减少开销,因为它节省了 async 方法
我说的对吗?
【问题讨论】:
-
Oldie but goodie - Asynchronous Programming in C# 5.0 part two Eric Lippert - “异步方法的全部意义在于您尽可能地留在当前线程上”
-
await 主要是一种花哨的方式来表达 ContinueWith。
标签: c# asp.net asynchronous async-await