आपको वह त्रुटि मिल रही है क्योंकि Task
कक्षा ने आपको देने से पहले ही कार्य शुरू कर दिया था। आपको कभी भी केवल Start
एक कार्य को कॉल करना चाहिए जिसे आप इसके निर्माता को कॉल करके बनाते हैं, और आपको यह भी नहीं करना चाहिए जब तक कि आपके पास कार्य को शुरू करने का एक अनिवार्य कारण नहीं है जब आप इसे बनाते हैं; यदि आप चाहते हैं कि यह अभी शुरू हो, तो आपको इसका उपयोग करना चाहिए Task.Run
या Task.Factory.StartNew
दोनों बनाने और एक नई शुरुआत करनी चाहिएTask
।
तो, अब हम जानते हैं कि बस उस pesky से छुटकारा पाने के लिए Start
। आप अपना कोड चलाएंगे और पाएंगे कि संदेश बॉक्स तुरंत दिखाया गया है, न कि 5 सेकंड बाद, इसके साथ क्या हो रहा है?
खैर, Task.Delay
बस आपको एक काम देता है जिसे 5 सेकंड में पूरा किया जाएगा। यह 5 सेकंड के लिए थ्रेड का निष्पादन बंद नहीं करता है। आप जो करना चाहते हैं, वह कुछ कोड है जिसे उस कार्य के पूरा होने के बाद निष्पादित किया जाता है। इसके ContinueWith
लिए जो है। यह दिए गए कार्य को पूरा करने के बाद आपको कुछ कोड चलाने देता है:
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
यह अपेक्षा के अनुरूप व्यवहार करेगा।
हम await
निरंतरता को और अधिक आसानी से जोड़ने के लिए C # 5.0 के कीवर्ड का लाभ उठा सकते हैं:
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
जबकि यहाँ क्या हो रहा है, इसका पूरा विवरण इस प्रश्न के दायरे से बाहर है, अंतिम परिणाम एक विधि है जो पिछले पद्धति के समान है; आपके द्वारा विधि को कॉल करने के 5 सेकंड बाद यह एक संदेश बॉक्स दिखाएगा, लेकिन विधि स्वयं दोनों मामलों में तुरंत वापस आ जाएगी। उस ने कहा, await
बहुत शक्तिशाली है, और हमें सरल और सरल प्रतीत होने वाले तरीकों को लिखने की अनुमति देता है, लेकिन यह ContinueWith
सीधे लिखने का उपयोग करने के लिए बहुत कठिन और गड़बड़ होगा । यह बॉयलरप्लेट कोड का एक बहुत कुछ निकालते हुए, त्रुटि से निपटने से बहुत सरल करता है।
Wait()
जब तक कार्य हल नहीं होता तब तक किसी कार्य को कॉल करना वर्तमान थ्रेड को ब्लॉक करेगा। यह लगभग कभी नहीं है कि आप क्या होना चाहते हैं।