2012-11-29 18 views
80

के लिए प्रतीक्षा करें मैं अपनी नौकरी खत्म करने के लिए void async विधि का इंतजार कैसे कर सकता हूं?एक शून्य एसिंक विधि

उदाहरण के लिए, मैं नीचे की तरह एक समारोह है:

async void LoadBlahBlah() 
{ 
    await blah(); 
    ... 
} 

अब मुझे यकीन है कि सब कुछ कहीं और आगे बढ़ने से पहले लोड किया गया है बनाना चाहते हैं।

उत्तर

97

सर्वश्रेष्ठ अभ्यास समारोह async void निशान केवल अगर यह आग और भूल जाते हैं है विधि, यदि आप प्रतीक्षा करना चाहते हैं, तो आपको इसे async Task के रूप में चिह्नित करना चाहिए।

मामले में अगर आप अभी भी इंतजार करना चाहते हैं, तो जैसे इतना await Task.Run(() => blah())

51

आप async Task करने के लिए अपने समारोह के हस्ताक्षर बदल तो आप कोड का उपयोग कर सकते कर सकते हैं प्रस्तुत here

2

आप वास्तव में मैन्युअल रूप से कुछ भी करने की जरूरत नहीं है, await कीवर्ड समारोह निष्पादन blah() रिटर्न जब तक रुक जाता है।

private async void SomeFunction() 
{ 
    var x = await LoadBlahBlah(); <- Function is paused 
    //do more stuff when LoadBlahBlah() returns 
} 

private async Task<T> LoadBlahBlah() 
{ 
    return await blah(); <- function is paused 
} 

T वस्तु के प्रकार blah() रिटर्न

आप वास्तव में नहीं await एक void समारोह इतना LoadBlahBlah() नहीं किया जा सकता कर सकते हैं void

+0

मैं 'LoadBlahBlah के लिए इंतजार करना चाहते हैं पर इंतजार कर सकते हैं()' समाप्त करने के लिए है, न कि 'blah()' – MBZ

+0

@MBZ अद्यतन जवाब – Mayank

+5

दुर्भाग्य से async शून्य तरीकों करना निष्पादन रोकें नहीं (async कार्य विधियों के विपरीत) – ghord

17

सबसे अच्छा समाधान async Task उपयोग करने के लिए है लपेट। आपको कई कारणों से async void से बचना चाहिए, जिनमें से एक composability है।

तो विधि नहीं बनाया जा सकता है Task (जैसे, यह एक ईवेंट हैंडलर है) वापस जाने के लिए है, तो आप SemaphoreSlim का उपयोग विधि संकेत है जब इसके बारे में बाहर निकलने के लिए है सकते हैं। finally ब्लॉक में ऐसा करने पर विचार करें।

2

एक ऑटो रीसेट करें, फ़ंक्शन को कॉल करें और फिर AutoResetEvent पर प्रतीक्षा करें और फिर इसे एसिंक शून्य के अंदर सेट करें जब आप जानते हैं कि यह किया गया है।

तुम भी एक टास्क कि आपके शून्य async से लौटने

संबंधित मुद्दे