繁体   English   中英

在CacheItemPolicy.UpdateCallback事件和其他事件委托上异步/等待

[英]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();
}

但这是一劳永逸的操作-但缓存更新事件需要在返回结果之前获取新数据。 同样适用于按钮命令事件-页面可以在命令完成之前完成。

您可以将任何返回voidTaskTask<T>方法标记为async 将方法标记为async不会更改方法的签名,因此,如果您希望VoidDelegate await它,则可以简单地将其标记为async

请注意,由于您现在有了一个async void方法,因此这是一个即弃即用的方法。 当有人调用委托时,该方法将很快返回,而异步工作继续进行,并且调用方将无法知道工作何时完成或是否出错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM