2012-10-26 29 views
15

कोड का उपयोग कर जब मैं ccrewrite से निम्नलिखित संकलन त्रुटि प्राप्त विंडोज 7 x64 पर VS2012 में 1.4.51019.0 संविदा: "विधि या ऑपरेशन लागू नहीं किया गया है। " कोड संविदा + Async .NET 4.5 में: "विधि या कार्यवाही लागू नहीं"

यह संपत्ति accessors का एक संयोजन और async तरीकों जो एक आंतरिक await की कमी के उपयोग की वजह से प्रतीत होता है।

प्रजनन कदम:

'पूर्ण' रनटाइम अनुबंध के साथ एक नया वर्ग पुस्तकालय बनाने के लिए सक्षम जाँच:

namespace CodeContractsAsyncBug 
{ 
    using System.Threading.Tasks; 

    public class Service 
    { 
     // Offending method! 
     public async Task ProcessAsync(Entity entity) 
     { 
      var flag = entity.Flag; 
     } 
    } 

    public class Entity 
    { 
     public bool Flag { get; set; } 
    } 
} 

किसी और को यह अनुभव किया है?

+0

'async' संशोधक को हटाने से समस्या ठीक हो जाती है, मुझे लगता है? –

+0

हां (सिवाय इसके कि आपको एक कार्य वापस करने की आवश्यकता होगी)। –

+2

यह माइक बार्नेट की परियोजना है। उसे ईमेल प्राप्त करना पसंद है इसलिए उसे इस बग के बारे में पिंग करने में संकोच न करें। mbarnett _at_ microsoft _dot_ com –

उत्तर

2

यह कोड अनुबंधों के संस्करण 1.5 में तय किया गया प्रतीत होता है।

+0

लडिंगटन भालू;) –

0

मेरा मानना ​​है कि async कीवर्ड सिर्फ इसके लिए खड़ा है - या तो आपके पास कोड के दौरान प्रतीक्षा है, जिसके द्वारा इसे एक कार्य उत्पन्न किया जाएगा और विधि कहलाए जाने पर संभाला जाएगा, या आपको स्पष्ट रूप से कार्य वापस करने की आवश्यकता है।

+2

आप निश्चित रूप से * कर सकते हैं * 'await' के बिना async' विधि। इसका आमतौर पर मतलब है कि कोड का लेखक यह नहीं समझता कि 'async' कैसे काम करता है (और यह इसके कारण चेतावनी उत्पन्न करता है), लेकिन यह काम करता है और मुझे लगता है कि यह कुछ दुर्लभ मामलों में उपयोगी हो सकता है। – svick

+0

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

2

एक async विधि जो await आमतौर पर प्रोग्रामिंग त्रुटि का संकेत नहीं देती है। एक कंपाइलर चेतावनी है जो आपको इस स्थिति के बारे में सूचित करेगी।

आप तुल्यकालिक एक अतुल्यकालिक हस्ताक्षर के साथ एक विधि को लागू करना चाहते हैं, यह करने के लिए सामान्य तरीके से एक गैर async विधि को लागू करने और एक Task, इस तरह के Task.FromResult<object>(null) के रूप में वापस जाने के लिए है। ध्यान दें कि इस दृष्टिकोण के साथ, लौटाए गए Task पर रखे जाने के बजाय अपवादों को समेकित रूप से उठाया जाता है।

+2

हाँ, लेकिन यह कोड अनुबंध त्रुटि की व्याख्या नहीं करता है। – svick

+1

मुझे इसके सही उपयोग के बारे में पता है और आप यह कहकर सही हैं कि गैर-एसिंक कोड को ठीक करने से समस्या हल हो जाती है। यह अभी भी कोड संविदा बग है, हालांकि :) –

1

पिछले कई महीनों में, हमने एसिंक विधियों को फिर से लिखने के साथ कई मुद्दों को ठीक किया है। मैं सुझाव दूंगा कि आप नवीनतम इंस्टॉलर पर फिर से अपना कोड आज़माएं और यदि आपको अभी भी कोई समस्या है, तो कृपया एक पूर्ण repro प्रदान करें।