Saya perlu memanggil asyncmetode dalam satu catchblok 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 awaitdalam catchatau finallyblok. Saya mempelajarinya karena kompiler tidak memiliki cara untuk kembali catchke blok untuk mengeksekusi apa yang ada setelah awaitinstruksi Anda atau sesuatu seperti itu ...
Saya mencoba menggunakan Task.Wait()untuk mengganti awaitdan saya menemui jalan buntu. Saya mencari di Web bagaimana saya dapat menghindari ini dan menemukan situs ini .
Karena saya tidak dapat mengubah asyncmetode 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! :)
awaitblok tangkap sebenarnya diperbolehkan sejak C # 6.0 (lihat jawaban saya di bawah)