[英]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.