2012-10-24 12 views
35

मैं"async टास्क <myObject> MyMethod (वस्तु myObj);" इंटरफेस की घोषणा करने में असमर्थ

interface IMyInterface 
{ 
    async Task<myObject> MyMethod(Object myObj); 
} 

संकलक की घोषणा करने में असमर्थ हूँ मुझसे कहता है:

  • संशोधक async लिए मान्य नहीं है यह आइटम
  • async संशोधक केवल तरीकों एक शरीर

है के लिए इस्तेमाल किया जा सकता है इस कुछ ऐसा जो कार्यान्वित किया जाना चाहिए, या एसिंक & की प्रकृति का इंतजार कभी भी होने से प्रतिबंधित है?

उत्तर

42

क्या एसिंक/प्रतीक्षा का उपयोग करके एक विधि लागू की गई है या नहीं कार्यान्वयन विस्तार है। विधि को व्यवहार कैसे करना चाहिए विवरण, जिसे सामान्य तरीके से निर्दिष्ट किया जाना चाहिए।

ध्यान दें कि यदि आप कर विधि एक Task या एक Task<T> लौटने के लिए, इसे और अधिक स्पष्ट है कि यह अतुल्यकालिक होना है, और शायद कठिन अतुल्यकालिक किया जा रहा बिना लागू करने के लिए किया जाएगा।

https://stackoverflow.com/a/6274601/43846

+1

+1 जॉन स्कीट के लिए कहते हैं:) – Noctis

13

अपने कार्यान्वयन async है या नहीं, से, अपने इंटरफेस के लिए कोई प्रासंगिकता है। दूसरे शब्दों में, इंटरफ़ेस निर्दिष्ट नहीं कर सकता है कि एक दी गई विधि को एसिंक्रोनस तरीके से कार्यान्वित किया जाना चाहिए।

बस अपने इंटरफ़ेस से async लें और यह संकलित होगा; हालांकि, एक इंटरफ़ेस निर्दिष्ट करके एसिंक्रोनस कार्यान्वयन को लागू करने का कोई तरीका नहीं है।

1

यदि आपके पास दो कार्यान्वयन के साथ एक इंटरफ़ेस है तो यह प्रत्येक कार्यान्वयन के लिए ऐसा दिखाई देगा।

public interface IUserManager 
{ 
    Task<bool> IsUserInRole(string roleName); 
} 

public class UserManager1 
{ 
    public async Task<bool> IsUserInRole(string roleName) 
    { 
     return await _userManager.IsInRoleAsync(_profile.Id, roleName); 
    } 
} 

public class UserManager2 
{ 
    public Task<bool> IsUserInRole(string roleName) 
    { 
     return Task.FromResult(Roles.IsUserInRole(roleName)); 
    } 
} 

यदि यह एक शून्य विधि आप गैर async विधि से return Task.CompletedTask; करने की जरूरत है (मैं .NET 4.5 और बाद में लगता है) भी

देखें: Return Task<bool> instantly

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