async वेट रिटर्न टास्क


131

क्या कोई समझा सकता है कि इसका मतलब एक तुल्यकालिक विधि में क्या है? अगर मैं विधि को बदलने की कोशिश करता हूं asyncतो वीएस इसके बारे में शिकायत करते हैं।

यह काम:

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

यह काम नहीं करता है:

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

तो मूल रूप से मैं जानना चाहूंगा कि इसका वास्तव में क्या मतलब है: Task.FromResult<object>(null);



@LB हम्म जो काम करता है! लेकिन अगर मैं सिर्फ return;काम भी करता है ...!
डेविड ड्यूरी

2
"काम नहीं करता है" जो काम नहीं कर रहा है उसका बहुत अच्छा विवरण प्रदान करता है। आपको प्राप्त होने वाला त्रुटि संदेश क्या है?
जॉन कोएनेर

@ जॉनकोनर मुझे लगता है कि यह बहुत स्पष्ट है कि कंपाइलर आपको वही त्रुटि दे सकता है जैसे आपने किसी voidफ़ंक्शन में मान वापस करने का प्रयास किया ।
बिंकी

जवाबों:


236

asyncतरीके सामान्य तरीकों से अलग हैं। आप जो भी asyncतरीकों से लौटते हैं वह एक में लिपटा होता है Task

यदि आप कोई मान नहीं लौटाते हैं (शून्य) तो इसे इसमें लपेटा जाएगा Task, यदि आप वापस लौटाते हैं तो intयह आपको लिपटेगा Task<int>

यदि आपके async विधि को वापस करने की आवश्यकता है, intतो आप विधि के वापसी प्रकार को चिह्नित करेंगे Task<int>और आप सादा intनहीं लौटाएंगे Task<int>। संकलक में परिवर्तित कर देंगे intकरने के लिए Task<int>आप के लिए।

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}

जब आप Task<object>अपने तरीके का रिटर्न टाइप करते हैं तो सैमवे होना चाहिएTask<Task<object>>

public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

चूंकि आपकी विधि वापस आ रही है Task, इसलिए इसे कोई मूल्य नहीं लौटना चाहिए। अन्यथा यह संकलन नहीं करेगा।

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

ध्यान रखें कि बिना awaitकथन के async विधि नहीं है async


1
मेरे लिए यह रिटर्न प्रकार काम नहीं करता है (मुझे लगता है कि मैं कुछ गलत कर रहा हूं)। उदाहरण स्थिर async टास्क <string> DoStuff () {... = someMethodAsync () प्रतीक्षा करें; वापसी "स्ट्रिंग मूल्य"; } .. var x = DoStuff (); लेकिन यह x - "टास्क <string>" टाइप के साथ है, टाइप "स्ट्रिंग" के साथ नहीं ... ऐसा क्यों है?
प्रोक्योरर्स

3
@Prokurors आप DoStuff()भी इंतजार करने की जरूरत है । उदाहरण के लिए:var x = await DoStuff();
श्रीराम सक्तीवेल

5
होना चाहिएreturn await Task.FromResult<object>(null);
संदीप तालबेथुला

@sandeeptalabathula वापस लौटने के बराबर है
श्रीराम सक्थिवेल

2
@ProfK Task.WhenAnyइसका उदाहरण है।
सर्व

55

आपको async का उपयोग करते समय प्रतीक्षित कीवर्ड का उपयोग करने की आवश्यकता है और आपका फ़ंक्शन रिटर्न प्रकार सामान्य होना चाहिए यहां रिटर्न वैल्यू के साथ एक उदाहरण दिया गया है:

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

यहाँ एक उदाहरण है, जिसमें कोई वापसी मूल्य नहीं है:

public async Task MethodName()
{
    await Task.CompletedTask;
}

यह पढ़हो:

TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx और कार्य: http://msdn.microsoft.com/en-us/library/system.thread .tasks (v = vs.110) .aspx

Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Await: http://msdn.microsoft.com/en-us/library/hh156528.aspx


9
आप केवल nullएक डमी कार्य की प्रतीक्षा करने के बजाय सीधे लौट सकते हैं ।
ली

5
@ देखें, लेकिन यदि आप ऐसा करते हैं, तो कंपाइलर शिकायत करता है (चेतावनी देता है) कि asyncविधि awaitकहीं और से कीवर्ड का उपयोग करने के सुझाव के साथ एसिंक्रोनस रूप से निष्पादित करेगी । मेरा सुझाव है कि कंपाइलर चेतावनी शोर को कम करने के लिए return Task.FromResult((object)null);केवल asyncकीवर्ड का उपयोग करें और हटाएं ।
बिंकी

हां, मैंने returnएक टास्क में सिर्फ उपयोग करने की कोशिश की है , लेकिन कार्य निष्पादित होता रहता है, क्योंकि returnवापस नहीं आ रहा हैTask
टर्नर बास

30

राज्य मशीन के निर्माण को आसान बनाने के लिए एसिंक्स कीवर्ड को जोड़ना सिंटैक्टिक शुगर है। संक्षेप में, संकलक आपका कोड लेता है;

public async Task MethodName()
{
     return null;
}

और इसे में बदल देता है;

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

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

जब वह कार्य पूरा हो जाएगा, तो आपके कार्य को फिर से निष्पादित किया जाएगा। तो चर की स्थिति को पुनर्स्थापित करने और अपने कोड के अगले स्लैब में कूदने के लिए विधि के शीर्ष पर कुछ अतिरिक्त कोड जोड़ा जाता है।

देखें क्या async और प्रतीक्षा उत्पन्न करता है? एक गौरी उदाहरण के लिए।

इस प्रक्रिया में आम तौर पर बहुत कुछ होता है जिस तरह से कंपाइलर पैदावार बयानों के साथ पुनरावृत्त तरीकों को संभालता है।


2

यह एक टास्क है जो टाइपिंग स्ट्रिंग (C # अनाम फ़ंक्शन या दूसरे शब्द में एक प्रतिनिधिमंडल लौटाता है जिसका उपयोग 'Func' किया जाता है)

    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";

        }))());
    }

1
उत्तर के रूप में कोड पोस्ट करते समय, कृपया बताएं कि आप क्या प्रदर्शित कर रहे हैं, कुछ स्पष्टीकरण शामिल करें। इस मामले में, आप एक पुराने प्रश्न का उत्तर जोड़ रहे हैं जिसमें पहले से ही कई उत्तर हैं। कृपया एक वाक्य जोड़ें या दो का वर्णन करें कि आपका नया उत्तर क्या प्रदर्शित कर रहा है, जो पहले से ही अन्य उत्तरों में नहीं दिखाया गया था। मैं यह नहीं कह रहा हूं कि आपके उत्तर में कुछ भी गलत है, बस यह पूछें कि आप अपने कोड के साथ जो दिखा रहे हैं उसे शब्दों में डालकर दूसरों की मदद करें।
टूलमेकरसेव

0

Async विधियों से वापस उचित प्रतिक्रिया प्राप्त करने के लिए, आपको उन कार्य विधियों को कॉल करते समय प्रतीक्षा करने की आवश्यकता है। यह टास्क वैल्यू टाइप करने के बजाय इसे वापस टाइप करने के लिए इंतजार करेगा।

उदाहरण के लिए सामग्री = StringAsyncTask प्रतीक्षा करें (

जहाँ सार्वजनिक async टास्क < string > StringAsyncTask ())

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.