2015-09-08 13 views
6

अवरुद्ध मैं लगातार 2 कार्य निष्पादित करने के लिए कोशिश कर रहा हूँ बिना पूरा करने के लिए एक async विधि कॉल के लिए प्रतीक्षा करें, लेकिन इससे पहले कि पहला काम पूरी तरह से समाप्त हो गया है दूसरा कार्य चल रहा है, क्योंकि यह awaitable हैएक टास्क कि धागा

var task1 = new Task(async() => 
{ 
    Trace.WriteLine("before delay"); 
    await Task.Delay(1000); 
    Trace.WriteLine("after delay"); 
}); 

task1.ContinueWith(task => Trace.WriteLine("continued")); 

task1.Start(); 
task1.Wait(); 

मैं उत्पादन बटोर

before delay 
after delay 
continued 

चाहते हैं, लेकिन मैं मिल

before delay 
continued 

मैं धागे को पकड़ने के बिना task1 को ब्लॉक करने का कोई तरीका है?

उत्तर

9

आपका एसिंक लैम्ब्डा शुरुआती बनाने new Task को लगता है कि कार्य पूरा हो गया है। यह पहले await पर लौटता है। कार्य कन्स्ट्रक्टर सीमा से बाहर है! इसका उपयोग न करें (लगभग कभी नहीं)।

यह अस्तित्व मूल रूप से ढांचे में एक डिज़ाइन बग है। अनस्टार्ट किए गए कार्यों को भी मौजूद नहीं होना चाहिए और Start विधि हटा दी जानी चाहिए। इसके लिए हमारे पास TaskCompletionSource है।

Task.Run(async() => ... का उपयोग करें। Task.Run में Task फ़ंक्शनिंग फ़ंक्शन के लिए विशेष समर्थन है।

+0

उन्होंने यह भी किसी अन्य कार्य के लिए 'task1.ContinueWith (...)' का परिणाम आवंटित और उस के बजाय 'task1' का कार्य प्रतीक्षा करने के लिए की जरूरत है। –

+0

बढ़िया! इसके लिए आंतरिक कार्य और सर्वोत्तम प्रथाओं के बारे में मुझे और जानकारी कहां मिल सकती है? –

+0

दुर्भाग्यवश, मुझे ऐसी किसी भी जगह से अवगत नहीं है। टीपीएल के साथ सबसे आम 10 मुद्दों का विवरण देने वाली साइट होनी चाहिए। वास्तव में, 9 5% स्टैक ओवरफ़्लो प्रश्न 10 मुद्दों से बने हैं। – usr

1

@ usr के जवाब की मदद के लिए मुझे लगता है कि इन मामूली परिवर्तन के साथ अपने मौजूदा कोड काम करने के लिए कैसे, दिखा लायक है:

Task<Task> task1 = new Task<Task>(new Func<Task>(async() => 
{ 
    Trace.WriteLine("before delay"); 
    await Task.Delay(1000); 
    Trace.WriteLine("after delay"); 
})); 

var task2 = task1.Unwrap(); 

var task3 = task2.ContinueWith(task => Trace.WriteLine("continued")); 

task1.Start(); 
task3.Wait(); 

आशा इस वास्तविक कार्य कार्यप्रवाह बेहतर ढंग से समझने में मदद करता है। Task.Unwrap सही ढंग से उपयोग किए जाने पर एक पावर टूल हो सकता है।

उस ने कहा, आपको वास्तव में Task ऑब्जेक्ट को इसके कन्स्ट्रक्टर के माध्यम से बनाने की आवश्यकता नहीं है।

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