【发布时间】:2015-08-02 05:55:56
【问题描述】:
操作方法:从委托 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)
是答:
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();
}
但这是一劳永逸 - 但缓存更新事件需要在返回结果之前获取新数据。同样适用于例如按钮命令事件 - 页面可以在命令完成之前完成。
【问题讨论】:
-
试试
Task.Run(async () => away bla); -
@abatishchev 没有理由这样做。
-
我会避免调用方法
XXXDelegate。它是一个方法,而不是一个委托,所以当它是一个方法时称它为委托是非常混乱的。 -
@abatishchev:这将缺少等待,如果没有 Unwrap,它似乎在大规模上不稳定。信息:blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
-
@Servy:这里的名字是伪的/只是为了解释它是什么/上下文等
标签: c# asp.net asynchronous async-await task-parallel-library