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?
}
sumber
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.Stream.ReadAsync()
dalam suatu metode, metode itu sendiri harus asinkron, dan mengembalikan diTask<T>
manaT
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 mendasariStream.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.Jawaban:
The
async
setaraAction<T>
adalahFunc<T, Task>
, jadi saya percaya ini adalah apa yang Anda cari:sumber
void
metode adalahTask
-mengembalikan metode; dengan demikian, ekuivalen asyncAction
adalahFunc<Task>
, dan ekuivalen asyncAction<T>
adalahFunc<T, Task>
. Info lebih lanjut di sini .Task
ketika tidak memiliki nilai kembali. Jika menggunakanasync
kata kunci, makaTask
instance aktual akan dibuat oleh mesin negara, bukan fungsinya secara langsung.Jadi saya percaya cara untuk mengimplementasikan ini adalah:
sumber
Task.Run
(dan bahkan lebih lagiStartNew
) di ASP.NET.