2012-09-22 17 views
7

मैं कोड की इस पंक्ति हैजारी रखने के दौरान मुझे कंपाइलर चेतावनी क्यों मिलती है?</p> <pre><code>t.ContinueWith(_ => form.Close(), TaskScheduler.FromCurrentSynchronizationContext()); </code></pre> <p>... संकलक जिसके बारे में यह कहना चाहता है:

चेतावनी 2 क्योंकि इस कॉल की प्रतीक्षा नहीं है, वर्तमान पद्धति के निष्पादन से पहले जारी है कॉल पूरा हो गया है कॉल के परिणामस्वरूप 'प्रतीक्षा' ऑपरेटर को लागू करने पर विचार करें।

अब, यह कोड नहीं लिखा गया था, लेकिन मैंने सोचा कि यह केवल मौजूदा कार्य के अंत में निरंतरता को जोड़ रहा है। मुझे नहीं लगता कि यह वास्तव में कार्य कार्य (या निरंतरता) चल रहा है। तो निश्चित रूप से केवल कार्य को संशोधित करने की यह प्रक्रिया एक तुल्यकालिक ऑपरेशन है? मुझे await क्यों करना होगा?

+0

कर सकते हैं मैं Haz Suround Coud? –

+0

क्या आप पूरी विधि पोस्ट कर सकते हैं? –

+1

स्टीफन, यह आपके कोड :-) http://stackoverflow.com/a/12513296/98422 –

उत्तर

8

मुझे await क्यों करना होगा?

आपको await नहीं है, यही कारण है कि यह एक चेतावनी है, कोई त्रुटि नहीं। लेकिन, यदि आप async विधि में हैं और आपके पास एक तरीका है जो एक प्रतीक्षा करने योग्य वस्तु देता है, तो अधिकांश समय, आपको इसे अनदेखा नहीं करना चाहिए।

सामान्य तुल्यकालिक कोड में, आप कुछ भी एक तरीका है आप कम्प्लिट्स कहा जाता है, हमेशा एक विधि कॉल ब्लॉक तक इंतजार करना विशेष करने की जरूरत नहीं है। लेकिन असीमित तरीकों के साथ, यदि आप पूरा होने तक प्रतीक्षा करना चाहते हैं तो आपको वास्तव में await करना होगा। इसके अलावा, अगर अतुल्यकालिक आपरेशन विफल रहता है और एक अपवाद फेंकता है, आप इसके बारे में पता नहीं होगा जब तक आप विधि का परिणाम await (या परिणाम से अपवाद किसी और तरीके से, इस तरह के Wait() बुला अगर awaitable एक Task है के रूप में मिलता है) ।

तो, यदि आप async विधि में एक लौटा हुआ प्रतीक्षा मूल्य अनदेखा करते हैं, तो संभव है कि आपके कोड में एक बग है, जो चेतावनी से बचने की कोशिश कर रहा है।

आपके मामले में, ContinueWith() एक Task, जो हो सकता है await एड देता है, तो संकलक मानता है कि आप चाहिएawait यह। लेकिन इस मामले में, आप निरंतर पूरा होने तक प्रतीक्षा नहीं करना चाहते हैं और Close() अधिकतर एक अपवाद नहीं फेंकेंगे। इसलिए, इस मामले में, चेतावनी एक झूठी सकारात्मक है, यह वास्तव में कोड में कोई समस्या नहीं दर्शाती है।

+0

ग्रेट उत्तर, धन्यवाद। क्या चेतावनी को रोकने से रोकने के लिए मैं कुछ भी कर सकता हूं, और इस प्रकार सभी _actual_ समस्याओं को अस्पष्ट कर रहा हूं? (मैं यहां अन्य मामलों में चेतावनी को अक्षम नहीं करना चाहता हूं)। –

+3

आप यह सिर्फ इस विधि के लिए अक्षम कर सकते हैं यदि आप जोड़ने के '#pragma अक्षम चेतावनी 4014' से पहले तो विधि और' #pragma चेतावनी के बाद 4014' बहाल।आम तौर पर, मैं आपको सलाह देता हूं कि चेतावनी किस बारे में शिकायत कर रही है, लेकिन इस मामले में, वास्तव में ठीक करने के लिए कुछ भी नहीं है, इसलिए इस विधि के लिए केवल चेतावनी को अक्षम करना मुझे लगता है। – svick

+1

एक और विकल्प एक चर को कार्य असाइन करना है। और फिर बस चर को अनदेखा करें। – wasabi