Bazı eşzamansız işlevlere sahip bir arayüzüm var.
Geri dönen yöntemler Task
olduğuna inanıyorum. async
bir 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, async
bunun bir uygulama detayı olmasından yararlanabilirsiniz .
Yapacak hiçbir şeyin await
yoksa, 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 Task
ve NotImplementedException
nesnelerini 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 .