Saya perlu memanggil async
metode dalam satu catch
blok sebelum melemparkan lagi pengecualian (dengan jejak tumpukannya) seperti ini:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Tapi sayangnya Anda tidak dapat menggunakan await
dalam catch
atau finally
blok. Saya mempelajarinya karena kompiler tidak memiliki cara untuk kembali catch
ke blok untuk mengeksekusi apa yang ada setelah await
instruksi Anda atau sesuatu seperti itu ...
Saya mencoba menggunakan Task.Wait()
untuk mengganti await
dan saya menemui jalan buntu. Saya mencari di Web bagaimana saya dapat menghindari ini dan menemukan situs ini .
Karena saya tidak dapat mengubah async
metode dan juga tidak tahu apakah mereka menggunakannya ConfigureAwait(false)
, saya membuat metode ini yang mengambil Func<Task>
yang memulai metode asinkron setelah kita berada di utas yang berbeda (untuk menghindari kebuntuan) dan menunggu penyelesaiannya:
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());
}
Jadi pertanyaan saya adalah: Apakah menurut Anda kode ini baik-baik saja?
Tentu saja, jika Anda memiliki beberapa penyempurnaan atau mengetahui pendekatan yang lebih baik, saya mendengarkan! :)
await
blok tangkap sebenarnya diperbolehkan sejak C # 6.0 (lihat jawaban saya di bawah)