簡體   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