[英]async/await on CacheItemPolicy.UpdateCallback event and other event delegates
如何:从委托void事件方法调用await方法?
将(ASP.NET)应用转换为异步是完全可行的。 但是不支持它的地方呢?
var policy = new CacheItemPolicy();
policy.UpdateCallback = CacheEntryUpdateCallback;
void VoidDelegate(CacheEntryUpdateArguments arguments) {
// need this - but no can't do :(
await SomeApi.AsyncOnlyMethodAsync();
}
等待在那里是不允许的,那该怎么办呢? 正确的做法是什么? 这个问题也适用于WebForms上的事件处理程序,例如myButton.Commmand += new CommandEventHandler(VoidDelegate)
是A:
void VoidDelegate(CacheEntryUpdateArguments arguments) {
Task.Factory.StartNew(new Func<Task>(async () => {
await SomeApi.AsyncOnlyMethodAsync();
})).Unwrap().Wait();
}
这将起作用,但启动另一个线程? 至少它不会使线程可用于该池,并且异步的目的已消失。
还是受支持的B:
async void VoidDelegate(CacheEntryUpdateArguments arguments) {
await SomeApi.AsyncOnlyMethodAsync();
}
但这是一劳永逸的操作-但缓存更新事件需要在返回结果之前获取新数据。 同样适用于按钮命令事件-页面可以在命令完成之前完成。
您可以将任何返回void
, Task
或Task<T>
方法标记为async
。 将方法标记为async
不会更改方法的签名,因此,如果您希望VoidDelegate
await
它,则可以简单地将其标记为async
。
请注意,由于您现在有了一个async void
方法,因此这是一个即弃即用的方法。 当有人调用委托时,该方法将很快返回,而异步工作继续进行,并且调用方将无法知道工作何时完成或是否出错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.