के लिए नीचे अपने प्रारंभिक बिंदु को आसान बनाने में करते हैं।
मान्य लेकिन व्यर्थ:
public async Task ExecuteAsync(Action action)
{
action();
}
यह कर के रूप में बहुत ज्यादा एक ही हो जाएगा:
public Task ExecuteAsync(Action action)
{
action();
return Task.FromResult(0);
}
है यही कारण है, यह क्या गैर async कर रहा था करूँगा, और फिर वापसी एक "पूरा" कार्य इसलिए कुछ भी प्राप्त नहीं हुआ है। यह ध्यान देने योग्य है हालांकि यह गैर-async से async में जाने में अक्सर एक वैध अंश-मार्ग बिंदु है।
बेहतर:
public async Task ExecuteAsync(Action action)
{
await Task.Run(() => action());
}
जो इस मामले में, यह है, क्योंकि एक भी शून्य-लौटने कॉल करने के लिए सरल किया जा सकता:
public async Task ExecuteAsync(Action action)
{
await Task.Run(action);
}
चाहे ऐसा करने के लायक है या नहीं अलग बात है। यह वर्तमान धागे को इस्तेमाल होने से मुक्त करता है, लेकिन काम करने के लिए दूसरे धागे में स्थानांतरित होता है। अगर हम इसे इसके परिणाम के इंतजार के लिए इंतजार कर रहे हैं तो इसे तब भी कहा जा सकता है जब हम गैर-एसिंक संस्करण को कॉल कर सकते हैं और इसके साथ किया जा सकता है। यदि हम कॉलर में WaitAll
कर रहे हैं, या ऐसा कुछ और जो इससे लाभान्वित है, तो यह वास्तव में उपयोगी हो सकता है।
संभावित ज्यादा बेहतर यह है:
public async Task ExecuteAsync(Action action)
{
await actionAsync();
}
यहाँ वहाँ विधि हम बुला रहे हैं की एक Async संस्करण है, तो हम इस बात का उपयोग करने के लिए बदल जाते हैं। अब, यह उपर्युक्त जैसा ही हो सकता है यदि actionAsync
बस थ्रेड को स्पिन करता है या थ्रेड पूल का उपयोग करता है। यदि actionAsync
कुछ एसिंक्रोनस I/O का उपयोग करता है तो इसके लिए बहुत बड़ा लाभ होता है।
नोट इस मामले में हम हो सकता है कि सिर्फ पूंछ तथाकथित टास्क हम पाते हैं:
public Task ExecuteAsync(Action action)
{
return actionAsync();
}
हालांकि, कि नहीं एक ही अगर हम कुछ हमारे विधि के भीतर एक await
के बाद किया की जरूरत होगी। उदाहरण के लिए:
public void Execute(Action action)
{
action();
otherAction();
}
बनने के लिए होगा:
public async Task Exectute(Action action)
{
await actionAsync();
await otherActionAsync();
}
या अगर otherAction
कोई async संस्करण था: यहाँ जवाब में
public async Task Exectute(Action action)
{
await actionAsync();
otherAction();
}
देखो: http://stackoverflow.com/questions/20593501/the-await-operator-can-only-be-used-in-async-lambda-expression –
आखिर में क्या कर रहा है? –
@ जेली मैं जो लिंक करना चाहता हूं उसे लागू करने के लिए उस लिंक का अनुसरण करूंगा। धन्यवाद – vcRobe