2012-06-21 21 views
30

मैं निम्न विधि है कि मेरे मेट्रो आवेदनक्या मैं इस एसिंक कॉल के लिए प्रतीक्षा की कमी के लिए संकलक चेतावनी को अनदेखा करने का अधिकार हूं?

void Model_ExceptionOccured(Exception ex) 
{ 
    var dlg = new Windows.UI.Popups.MessageDialog("An exception occured during verification: " + ex.Message, "Exception"); 
    dlg.ShowAsync(); 
} 

'dlg.ShowAsync()' के एक भाग में एक अपवाद तब होता है जब शुरू हो रहा है है - कॉल अतुल्यकालिक है, लेकिन मैं के लिए प्रतीक्षा करने की परवाह नहीं करते परिणाम। संकलक, हालांकि इसके लिए एक चेतावनी उत्पन्न करता है:

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

मुझे परवाह करना चाहिए? चेतावनी से छुटकारा पाने के अलावा, क्या कोई कारण है कि मुझे प्रतीक्षा कीवर्ड जोड़ना चाहिए?

उत्तर

27

नीचे दिए गए लिंक के अनुसार, एलेक्स द्वारा दिए गए उत्तर सही नहीं हैं। एक एसिंक कॉल के दौरान फेंकने वाले अपवादों का इंतजार नहीं किया जाएगा। इस चेतावनी से छुटकारा पाने के लिए, आपको एक चर में async कॉल का कार्य वापसी मान असाइन करना चाहिए। यह सुनिश्चित करता है कि आपके पास फेंकने वाले किसी अपवाद तक पहुंच है, जिसे रिटर्न वैल्यू में इंगित किया जाएगा।

http://msdn.microsoft.com/en-us/library/hh965065(v=vs.110).aspx (VB.NET)

http://msdn.microsoft.com/en-us/library/hh873131.aspx (सी #)

+0

VS2012 में वे बदल दिया है: (मेरी Update_Click ईवेंट हैंडलर में)

StatusLabel.Text = "Preparing " + feedArticleList1.Feed.Title; UpdateCheck.Enabled = true; UpdateTask = feedArticleList1.Feed.UpdateFeedAsync(); 

बाद में मेरी घड़ी के लिए ईवेंट हैंडलर में, मैं UpdateTask.Status जाँच unobserved कार्य अपवादों के लिए डिफ़ॉल्ट नीति। प्रक्रिया को समाप्त करना डिफ़ॉल्ट व्यवहार था। – alexm

+0

आपके द्वारा प्रदान किया गया लिंक वीबी-विशिष्ट त्रुटि दिखाता है। क्या आपके पास सी # के लिए समान संदर्भ है? – alexm

+0

http://msdn.microsoft.com/en-us/library/hh873131.aspx सी # संदर्भ है। – poke

6

कि के साथ इस मुद्दे अगर dlg.ShowAsync(); में कोड एक अपवाद यह बिना क्रिया छोड़ दिया जाएगा फेंकता है और finalizer धागा संभावित अपने कार्यक्रम समाप्ति के कारण द्वारा बाद में फिर से डाल दिया जाएगा है।

क्या वास्तव में होता है नेट अपवाद नीति पर निर्भर करता है

MSDN पर This article में यह उल्लेख है:

आप एक काम है कि एक अपवाद प्रसारित पर इंतजार नहीं है, या इसकी अपवाद संपत्ति का उपयोग , अपवाद को कचरा-एकत्रित होने पर .NET अपवाद नीति के अनुसार अपवादित किया जाता है।

जब वीएस 2012 अंततः भेज दिया गया था, तो अनचाहे कार्य अपवादों की डिफ़ॉल्ट नीति अपवाद को अनदेखा करने के लिए प्रक्रिया समाप्त करने से बदल गई।

-1

मैं एक ही समस्या में पड़ गए, और यहाँ मेरे समाधान है:

मैं एक टास्क वस्तु बनाया, async के उत्पादन सौंपा टास्क ऑब्जेक्ट पर फ़ंक्शन करें, और समय-समय पर कार्य की स्थिति की जांच करने के लिए टाइमर का उपयोग करें।

यहाँ एक संक्षिप्त उदाहरण है:

switch (UpdateTask.Status) 
{ 
    case TaskStatus.Canceled: 
    case TaskStatus.Created: 
    case TaskStatus.Running: 
    case TaskStatus.WaitingForActivation: 
    case TaskStatus.WaitingForChildrenToComplete: 
    case TaskStatus.WaitingToRun: 
     StatusLabel.Text = UpdateTask.Status.ToString(); 
     break; 
    case TaskStatus.RanToCompletion: 
     StatusLabel.Text = "Update Complete " + DateTime.Now.ToShortTimeString(); 
     UpdateCheck.Enabled = false; 
     break; 
    case TaskStatus.Faulted: 
     throw (UpdateTask.Exception); 
    default: 
     break; 
} 
+1

आप कर सकते हैं उसी प्रभाव के लिए कार्य अपवाद और जारी रखें का उपयोग करें - ऐसा लगता है कि आप पहिया को फिर से शुरू कर रहे हैं, विशेष रूप से एसिंक विधियों पर मतदान शुरू कर रहे हैं। – Mathieson

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