2012-08-28 16 views
12

मैं एक अंतरफलकएक खाली इंटरफ़ेस पद्धति पर async का उपयोग कैसे करें

interface IFoo { 
    Task SomeMethodAsync(); 
} 

है कहो और मैं इस इंटरफ़ेस को लागू करना चाहता था, लेकिन एक वर्ग के लिए विधि खाली है।

क्या मुझे इस चेतावनी के साथ रहना चाहिए?

async Task SomeMethodAsync() {} 

या क्या मुझे इसे कुछ डमी कार्य वापस करना चाहिए?

async Task SomeMethodAsync() { await Task.Run(() => {}); } 

या कोई और विकल्प है?

इसके अलावा मैं इस विधि को एक स्पष्ट इंटरफ़ेस विधि के रूप में कार्यान्वित करना चाहता हूं। क्या इससे कोई फर्क पड़ता है?

+0

[इंटरफेस और एसिंक विधियों] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/13573516/interfaces-and-async-methods) – abatishchev

उत्तर

14

तरीके जो Task लौटाते हैं async होने की आवश्यकता नहीं है।

मैं कुछ इस तरह की सिफारिश करेंगे:

Task IFoo.SomeMethodAsync() 
{ 
    return Task.FromResult(true); 
} 

मैं यह सोचते कर रहा हूँ कि यह एक तुल्यकालिक विधि थी, तो आप सिर्फ एक खाली विधि शरीर के लिए होता है; यह एक खाली विधि निकाय के समतुल्य async है।

2

यह केवल तभी निर्भर करता है कि फ्रेमवर्क को ऐसे मामलों को संभालना है।

आप है, imo, कई विकल्प:

  • उठाने के लिए एक अपवाद (तुरंत निष्पादन टूट जाएगा, और आप निष्पादन श्रृंखला में कुछ जगह में किसी तरह संभाल यह है)।

  • वापसी default-value (कि एक समाधान आप द्वारा की पेशकश की जा सकता है:। सिर्फ एक खाली कार्य है कि कुछ नहीं करता इस बारे में बुरा है कि मैं समारोह उम्मीद यह कुछ, यह मेरे बारे में सूचित नहीं करता है फोन कुछ भी लेकिन या तो कुछ भी नहीं करते। इमो, यह बुरा डिजाइन है।

  • वापसी कुछ not-valid-value है, जो इतनी फोन करने वाले कॉलर के द्वारा रोका "जानता" है कि कुछ ठीक नहीं है

0

मैं इसमें एक सार आधार वर्ग के साथ भाग गया। मैंने कोशिश की स्टीफन Cleary की विधि है, लेकिन सी # 6.

मेरी आधार विधि का एक उदाहरण में संकलक त्रुटियों हो रही थी:

protected override async Task OnFoo(Bar bar) 
{ 
    await Task.FromResult(true); 
} 
:

protected abstract Task OnFoo(Bar bar); 

यह मैं अपने व्युत्पन्न वर्ग में करना था क्या है

दूसरे उत्तर के साथ समस्या वाक्यांश में return कीवर्ड था। क्योंकि Task का वापसी मूल्य अनिवार्य रूप से void है, आप कुछ भी वापस नहीं कर सकते हैं। इसके अलावा, await कीवर्ड आवश्यक है।

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