İstisnayı (yığın izlemesi ile) tekrar atmadan önce async
bir catch
blokta bir yöntemi çağırmam gerekiyor :
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Ama maalesef await
bir catch
veya finally
blokta kullanamazsınız . Bunu öğrendim çünkü derleyicinin catch
sizin await
talimatınızdan sonra olanı yürütmek için bir bloğa geri dönme yolu yok ...
Ben kullanmaya çalıştı Task.Wait()
yerine await
ve bir kilitlenme var. Web'de bundan nasıl kaçınabileceğimi araştırdım ve bu siteyi buldum .
async
Yö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! :)
await
catch bloğu içinde aslında (aşağıda benim cevabını bakın) C # 6.0 beri izin verilir