हमें Task.ContinueWith()
विधि क्यों चाहिए? क्या हम सिर्फ कार्य निकाय के अंदर "निरंतरता कोड" नहीं लिख सकते हैं?हमें क्यों जारी रखने की विधि की आवश्यकता है?
उत्तर
कभी-कभी आपको बाहर से एक कार्य प्राप्त होता है और आप अपनी निरंतरता को श्रृंखला में रखना चाहते हैं। कार्य के बिना कार्य बनाने के तरीके भी हैं (उदाहरण के लिए कार्य पूर्णीकरण स्रोत का उपयोग करना)।
टास्क निरंतरता कार्य की जंजीरों की अनुमति, श्रृंखला में प्रत्येक कार्य एक अन्य टास्क
इसके अलावा द्वारा पीछा किया जाता Task.ContinueWith
विधि में आप एसिंक्रोनस रूप से जांच कर सकते हैं Task
TaskContinuationOptions
साथ जब लक्ष्य Task
पूरा करता है या कोई त्रुटि होती है
Task task = Task.Factory.StartNew
(
() =>
{
//Your action when the task started
}
);
task.ContinueWith
(
_ =>
{
//Your action when the task completed
},
CancellationToken.None,
TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()
);
task.ContinueWith
(
(t) =>
{
//Action when error occured
Exception exception = null;
if (t.Exception.InnerException != null)
{
exception = t.Exception.InnerException;
}
else
{
exception = t.Exception;
}
//You can use this exception
},
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()
);
अधिक जानकारी के लिए देखने के here
साशा Goldshtein के जवाब सही है। ऐसे कई उदाहरण हैं जहां आपके 'जारी रखें' रचना कोड के पास सीधे पहुंच नहीं है, या किसी कार्य की निष्पादन विधि भी सेट नहीं है। उदाहरण के लिए, एक प्लग करने योग्य प्रणाली जो कुल योग करना चाहता है।
हालांकि, एक और कारण है जो लागू हो सकता है। ग्रैन्युलरिटी
TaskCreationOptions.LongRunning के उपयोग को उत्तेजित करने वाली आवश्यकताओं पर विचार करें। समानांतर प्रणाली में जहां कई सैकड़ों प्रक्रियाओं को निर्धारित, निष्पादित और पूरा किया जा रहा है, कार्य शेड्यूलर कार्यों को शेड्यूल करते समय कुशल प्रोसेसर एफ़िनिटी को बढ़ावा देने के लिए काम कर रहा है।
यदि आप ऐसी परिस्थिति में हैं जहां आप ठीक से काम किए गए उप कार्यों में एक कार्य को तोड़ सकते हैं और उन्हें चेन कर सकते हैं, तो आपको अब TaskCreationOptions.LongRunning का उपयोग करने की आवश्यकता नहीं होगी। सरल शब्दों में, यह बेहतर प्रदर्शन करेगा क्योंकि एक ही समय में खत्म करने के लिए 100 छोटे कार्यों को निर्धारित करना आसान है, क्योंकि यह केवल 4 कोर उपलब्ध वातावरण में ऐसा करने के लिए 10 बड़े कार्यों को निर्धारित करना है। याद रखें कि एक जंजीर कार्य को इसके पूर्ववर्ती के तुरंत बाद शुरू करने की गारंटी नहीं है।
यह एक दिलचस्प सवाल है और एक ऐसा होता है जब आप स्केलेबल सिस्टम चाहते हैं तो केवल एक मुद्दा बन जाता है।
यदि आप मुझसे पूछते हैं, तो आपको जहां भी संभव हो, KeepWith() का उपयोग करना चाहिए क्योंकि यह आपके ऐप पैमाने पर मदद करेगा।