Bazı eşzamansız işlevlere sahip bir arayüzüm var.
Geri dönen yöntemler Taskolduğuna inanıyorum. asyncbir uygulama ayrıntısıdır, bu nedenle arayüz yöntemlerine uygulanamaz.
Arayüzü uygulayan bazı sınıfların bekleyecek hiçbir şeyi yoktur ve bazıları sadece fırlatabilir.
Bu durumlarda, asyncbunun bir uygulama detayı olmasından yararlanabilirsiniz .
Yapacak hiçbir şeyin awaityoksa, geri dönebilirsin Task.FromResult:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
Atma durumunda NotImplementedException, prosedür biraz daha uzun:
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
Çok fazla yöntem fırlatma yönteminiz varsa NotImplementedException(ki bu, bazı tasarım düzeyinde yeniden düzenlemenin iyi olacağını gösterebilir), o zaman kelimeyi bir yardımcı sınıfa toplayabilirsiniz:
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;
}
Yardımcı sınıf, aynı dönüş türüne sahip her yöntem kendi Taskve NotImplementedExceptionnesnelerini paylaşabileceğinden, aksi takdirde GC'nin toplaması gereken çöpü de azaltır .
AsyncEx kitaplığımda birkaç başka "görev sabiti" türü örneğim var .