Sedikit informasi latar belakang.
Saya mempelajari tumpukan API Web dan saya mencoba merangkum semua data dalam bentuk objek "Hasil" dengan parameter seperti Success dan ErrorCodes.
Namun metode yang berbeda, akan menghasilkan hasil yang berbeda dan kode kesalahan tetapi objek hasil umumnya akan dipakai dengan cara yang sama.
Untuk menghemat waktu dan juga untuk mempelajari lebih lanjut tentang kemampuan async / menunggu di C #, saya mencoba untuk membungkus semua metode tubuh dari aksi api web saya dalam delegasi aksi asinkron tetapi terjebak dalam sedikit hambatan ...
Diberikan kelas-kelas berikut:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Saya ingin menulis metode yang melakukan tindakan pada objek Hasil dan mengembalikannya. Biasanya melalui metode sinkron
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Tetapi bagaimana cara mengubah metode ini menjadi metode asinkron menggunakan async / menunggu?
Inilah yang saya coba:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
Stream.ReadAsync()
dalam suatu metode, metode itu sendiri harus asinkron, dan mengembalikan di Task<T>
mana T
Anda akan kembali adalah metode yang sinkron. Idenya adalah bahwa dengan cara ini, setiap penelepon metode Anda kemudian dapat "menunggu secara tidak sinkron" (saya tidak tahu apa istilah yang baik untuk ini) untuk mendasari Stream.ReadAsync()
untuk menyelesaikan. Metafora untuk ini yang dapat Anda gunakan adalah bahwa async "menular", dan menyebar dari tingkat rendah I / O bawaan ke kode lain yang hasilnya tergantung pada kata I / O tersebut.
new
-ing atasT
, mengapa metode kebutuhan Anda untuk menjadi asynchronous? AFAIK dalam kode menggunakan API asinkron, Anda hanya perlu menyebarkanasync
ness dari metode lain yang Anda gunakan.