थोड़ी पृष्ठभूमि की जानकारी।
मैं वेब एपीआई स्टैक सीख रहा हूं और मैं सफलता और त्रुटिकोड जैसे मापदंडों के साथ "परिणाम" ऑब्जेक्ट के रूप में सभी डेटा को एनकोड करने की कोशिश कर रहा हूं।
हालांकि, अलग-अलग विधियां अलग-अलग परिणाम और त्रुटि कोड उत्पन्न करेंगी, लेकिन परिणाम वस्तु को आम तौर पर उसी तरह त्वरित किया जाएगा।
कुछ समय बचाने के लिए और C # में async / प्रतीक्षारत क्षमताओं के बारे में और जानने के लिए, मैं अपने वेब एपी कार्यों की सभी विधि निकायों को एक एसिंक्रोनस एक्शन डेलिगेट में लपेटने की कोशिश कर रहा हूं, लेकिन थोड़ा बहुत रोड़ा अटक गया ...
निम्नलिखित वर्गों को देखते हुए:
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;
}
}
}
मैं एक विधि लिखना चाहता हूं जो एक परिणाम ऑब्जेक्ट पर एक क्रिया करता है और इसे वापस करता है। आम तौर पर तुल्यकालिक तरीकों के माध्यम से यह होगा
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
लेकिन मैं इस पद्धति को एसिंक्रोनस / वेट का उपयोग करके एक अतुल्यकालिक विधि में कैसे बदलूं?
यही मैंने कोशिश की है:
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?
}
Stream.ReadAsync()
एक विधि में, उस विधि में ही अतुल्यकालिक होना चाहिए, और वापसी एक Task<T>
जहां T
है जो आप वापस आ गए होता विधि तुल्यकालिक थे। यह विचार यह है कि इस तरह से, आपके विधि का प्रत्येक कॉलर तब "असिंक्रोनसली प्रतीक्षा" कर सकता है (मुझे नहीं पता कि इसके लिए एक अच्छा शब्द क्या है) अंतर्निहित Stream.ReadAsync()
को पूरा करने के लिए। इसके लिए एक रूपक आप उपयोग कर सकते हैं कि async "संक्रामक" है, और निम्न-स्तर के अंतर्निहित I / O से दूसरे कोड में फैलता है, जिनके परिणाम I / O के उन लोगों पर निर्भर करते हैं।
new
ऊपर हैंT
, तो आपकी पद्धति को अतुल्यकालिक होने की आवश्यकता क्यों है? अतुल्यकालिक एपीआई का उपयोग करके कोड में AFAIK , आपको केवलasync
उन अन्य तरीकों से नेस का प्रचार करने की आवश्यकता है जो आप उपयोग करते हैं।