İstisnayı (yığın izlemesi ile) tekrar atmadan önce asyncbir catchblokta bir yöntemi çağırmam gerekiyor :
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Ama maalesef awaitbir catchveya finallyblokta kullanamazsınız . Bunu öğrendim çünkü derleyicinin catchsizin awaittalimatınızdan sonra olanı yürütmek için bir bloğa geri dönme yolu yok ...
Ben kullanmaya çalıştı Task.Wait()yerine awaitve bir kilitlenme var. Web'de bundan nasıl kaçınabileceğimi araştırdım ve bu siteyi buldum .
asyncYöntemleri değiştiremediğim ve kullanıp kullanmadıklarını bilmediğim için ConfigureAwait(false), Func<Task>farklı bir iş parçacığı üzerindeyken (kilitlenmeyi önlemek için) bir zaman uyumsuz yöntemi başlatan ve tamamlanmasını bekleyen şu yöntemleri oluşturdum :
public static void AwaitTaskSync(Func<Task> action)
{
Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}
public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}
public static void AwaitSync(Func<IAsyncAction> action)
{
AwaitTaskSync(() => action().AsTask());
}
public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
return AwaitTaskSync(() => action().AsTask());
}
Yani sorum şu: Bu kodun uygun olduğunu düşünüyor musunuz?
Elbette, bazı geliştirmeleriniz varsa veya daha iyi bir yaklaşım biliyorsanız, dinliyorum! :)
awaitcatch bloğu içinde aslında (aşağıda benim cevabını bakın) C # 6.0 beri izin verilir