मुझे कुछ async फ़ंक्शंस के साथ एक इंटरफ़ेस मिला है।
लौटने के तरीके Task
, मेरा मानना है। async
एक कार्यान्वयन विवरण है, इसलिए इसे इंटरफ़ेस विधियों पर लागू नहीं किया जा सकता है।
इंटरफ़ेस को लागू करने वाले कुछ वर्गों के पास प्रतीक्षा करने के लिए कुछ भी नहीं है, और कुछ बस फेंक सकते हैं।
इन मामलों में, आप इस तथ्य का लाभ उठा सकते हैं कि async
कार्यान्वयन विवरण है।
यदि आपके पास कुछ नहीं है await
, तो आप बस वापस आ सकते हैं Task.FromResult
:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
फेंकने के मामले में NotImplementedException
, प्रक्रिया थोड़ी अधिक चिंताजनक है:
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
यदि आपके पास बहुत सारी विधियाँ हैं NotImplementedException
(जो स्वयं ही संकेत कर सकती हैं कि कुछ डिज़ाइन-स्तर की रिफैक्टरिंग अच्छी होगी), तो आप शब्द को एक सहायक वर्ग में लपेट सकते हैं:
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;
}
सहायक वर्ग कचरा भी कम करता है जिसे जीसी को अन्यथा इकट्ठा करना होगा, क्योंकि प्रत्येक विधि उसी रिटर्न प्रकार के साथ अपने Task
और NotImplementedException
वस्तुओं को साझा कर सकती है ।
मेरे पास अपने AsyncEx लाइब्रेरी में कई अन्य "कार्य स्थिर" प्रकार के उदाहरण हैं ।