Saya punya antarmuka dengan beberapa fungsi asinkron.
Metode kembali Task
, saya yakin. async
adalah detail implementasi, jadi tidak bisa diterapkan ke metode antarmuka.
Beberapa kelas yang mengimplementasikan antarmuka tidak memiliki apa-apa untuk menunggu, dan beberapa mungkin hanya melempar.
Dalam kasus ini, Anda dapat memanfaatkan fakta yang async
merupakan detail implementasi.
Jika Anda tidak punya apa-apa await
, maka Anda bisa kembali Task.FromResult
:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
Dalam kasus melempar NotImplementedException
, prosedurnya sedikit lebih bertele-tele:
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
Jika Anda memiliki banyak metode melempar NotImplementedException
(yang dengan sendirinya dapat menunjukkan bahwa beberapa pemfaktoran ulang tingkat desain akan baik), maka Anda dapat membungkus wordiness menjadi kelas pembantu:
public static class TaskConstants<TResult>
{
static TaskConstants()
{
var tcs = new TaskCompletionSource<TResult>();
tcs.SetException(new NotImplementedException());
NotImplemented = tcs.Task;
}
public static Task<TResult> NotImplemented { get; private set; }
}
public Task<int> Fail() // note: no "async"
{
return TaskConstants<int>.NotImplemented;
}
Kelas pembantu juga mengurangi sampah yang GC dinyatakan akan harus mengumpulkan, karena masing-masing metode dengan tipe kembali sama dapat berbagi nya Task
dan NotImplementedException
benda-benda.
Saya memiliki beberapa contoh jenis "konstanta tugas" lainnya di perpustakaan AsyncEx saya .