2014-07-02 13 views
7

निम्नलिखित कोड हमेशा के लिए स्थिर हो जाएगा।कार्य। डेले कभी पूरा नहीं

public async Task DoSomethingAsync() 
{ 
    await Task.Delay(2000); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    DoSomethingAsync().Wait(); 
    // Task.Delay(2000).Wait(); 
} 

अगर मैं बाहर टिप्पणी की कोड के साथ DoSomethingAsync करने के लिए कॉल के लिए स्विच, यह उम्मीद करती है। मुझे संदेह है कि किसी भी तरह से नेस्टेड इंतजार एक डेडलॉक पैदा कर रहे हैं, लेकिन मुझे यकीन नहीं है कि क्यों, या इसे कैसे ठीक किया जाए।

+0

के संभावित डुप्लिकेट [एक async/उदाहरण है कि एक गतिरोध का कारण बनता है का इंतजार] (http://stackoverflow.com/questions/15021304/an-async-await-example-that-causes-a -डेडलॉक) –

उत्तर

22

मानते हैं Button_ClickGUI धागे में आपके हाथों पर एक डेडलॉक है।

जब आप एक काम आप तुल्यकालिक धागा अवरुद्ध कर रहे हैं जब तक कार्य समाप्त हो जाती है पर Wait उपयोग करें, लेकिन काम खत्म कभी नहीं होगा क्योंकि निरंतरता (Task.Delay(2000); के पूरा होने) जीयूआई धागे पर साथ ही चलाना चाहिए (जिस पर अवरुद्ध है Wait).

आप कई समाधान है या तो ConfigureAwait(false) का उपयोग जीयूआई धागा के SynchronizationContext पर कब्जा नहीं करने के लिए:।

public async Task DoSomethingAsync() 
{ 
    await Task.Delay(2000).ConfigureAwait(false); 
} 

या (जो मेरा सुझाव है) एक async void ईवेंट हैंडलर (का उपयोग जो एक के लिए केवल उपयुक्त जगह है async void विधि):

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    await DoSomethingAsync(); 
} 

public async Task DoSomethingAsync() 
{ 
    await Task.Delay(2000); 
} 
+1

मुझे गुई-थ्रेड-एसिंक-प्रतीक्षा बग का कारण खोजने के लिए लगभग 3h ले लिया ... अगर मैं कर सकता तो मैं आपको दो अप दूंगा! –

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