【发布时间】:2016-04-06 18:13:43
【问题描述】:
给定:
- ASP.NET/WCF Web 服务上的旧式非异步 API 方法
- 新的异步内部库
- 未来应该使用的新异步 Web API 控制器
- 只有异步接口的“存储提供者”对象。它的测试在异步运行以及在请求上下文之外同步运行时通过。
“一直异步”选项不在讨论范围内,因为它会破坏向后兼容性。
public class Impl {
// This works fine when used asynchronously
public Task<Guid> SaveThingAsync(Thing thingToSave) {
return await _storageProvider.saveAsync(thingToSave);
}
public Guid SaveThing(Thing thingToSave) {
// "Obviously", this code creates a deadlock when called
// from within the request context
// return SaveThingAsync(thingToSave).Result
// Not so obviously, this also creates a deadlock
// return SaveThingAsync(thingToSave)
// .ConfigureAwait(false)
// .GetAwaiter()
// .GetResult()
// This was deadlocking, but magically stopped
// return Task.Run(
// async () => await SaveThingAsync(thingToSave)
// .ConfigureAwait(false)
// ).Result;
// This one works
var saveTask = Task.Run(async () =>
await SaveThingAsync(thingToSave)));
var result = saveTask.ConfigureAwait(false).GetAwaiter().GetResult();
return result;
}
为什么?
【问题讨论】:
标签: c# asynchronous task