Saat ini saya mencoba membuat aplikasi saya menggunakan beberapa metode Async. Semua IO saya dilakukan melalui implementasi eksplisit antarmuka dan saya agak bingung tentang cara membuat operasi asinkron.
Seperti yang saya lihat, saya memiliki dua opsi dalam penerapan:
interface IIO
{
void DoOperation();
}
OPSI 1: Lakukan implementasi implisit async dan tunggu hasilnya dalam implementasi implisit.
class IOImplementation : IIO
{
async void DoOperation()
{
await Task.Factory.StartNew(() =>
{
//WRITING A FILE OR SOME SUCH THINGAMAGIG
});
}
#region IIO Members
void IIO.DoOperation()
{
DoOperation();
}
#endregion
}
OPSI2: Lakukan asinkron implementasi eksplisit dan tunggu tugas dari implementasi implisit.
class IOAsyncImplementation : IIO
{
private Task DoOperationAsync()
{
return new Task(() =>
{
//DO ALL THE HEAVY LIFTING!!!
});
}
#region IIOAsync Members
async void IIO.DoOperation()
{
await DoOperationAsync();
}
#endregion
}
Apakah salah satu dari penerapan ini lebih baik daripada yang lain atau adakah cara lain yang tidak saya pikirkan?
sumber
async
):async Task IIO.DoOperationAsync()
. Dan maksud Anda di mana Andaawait
kembaliTask
? Ke mana pun Anda meneleponDoOperationAsync()
.Task.Run()
, kode IO itu harus asinkron itu sendiri dan Anda akan melakukannyaawait
secara langsung. Misline = await streamReader.ReadLineAsync()
.Solusi yang lebih baik adalah memperkenalkan antarmuka lain untuk operasi asinkron. Antarmuka baru harus mewarisi dari antarmuka asli.
Contoh:
PS Mendesain ulang operasi asinkron Anda sehingga mereka mengembalikan Task, bukan void, kecuali Anda benar-benar harus mengembalikan void.
sumber
GetAwaiter().GetResult()
bukanWait()
? Dengan begitu Anda tidak perlu membongkarAggregateException
untuk mengambil pengecualian dalam.class Impl : IIO, IIOAsync
. IIO dan IIOAsync sendiri, bagaimanapun, adalah kontrak berbeda yang dapat menghindari penarikan 'kontrak lama' ke kode yang lebih baru.var c = new Impl(); IIOAsync asAsync = c; IIO asSync = c
.