मेरे पास एक छोटा एसिंक कार्य है जिसे इसे शुरू करने के बाद अक्सर रद्द करने की आवश्यकता होगी। "टास्क" श्रेणी में एक IsCanceled संकेतक है जो मुझे लगता है कि यह सुनिश्चित करने के लिए सुविधाजनक होगा कि एसिंक कार्य पूरा होने के बिना रद्द कर दिया गया था, लेकिन जहां तक मैं एक async कार्य को रद्द करने के रूप में चिह्नित करने का एकमात्र तरीका बता सकता हूं async फ़ंक्शन में एक कार्य CanceledException फेंकने के लिए। नियमित रूप से एक अपवाद फेंकना, ऐसी परिस्थिति को इंगित करने के लिए जो अप्रत्याशित रूप से होता है, मैं समझता हूं कि अपवादों का उपयोग कैसे किया जाना चाहिए। क्या किसी को एसिंक कार्य को रद्द करने के लिए एक बेहतर तरीका पता है जब इसे अक्सर होने की उम्मीद है?सी # async सीटीपी - मैं कार्य को रद्द करने के बिना रद्द किए गए एसिंक कार्य को कैसे चिह्नित करूं?
class MightBeCanceled<T>
{
public readonly T Value;
public readonly bool IsCanceled;
public MightBeCanceled(T value) { Value = value; IsCanceled = false; }
public static MightBeCanceled<T> Canceled = new MightBeCanceled<T>(default(T), true);
private MightBeCanceled(T value, bool isCanceled) { Value = value; IsCanceled = isCanceled; }
}
...
static async Task<MightBeCanceled<int>> Foo()
{
if (someCancellationCondition)
return MightBeCanceled<int>.Canceled;
else
return new MightBeCanceled<int>(42);
}
static async void Bar()
{
var mightBeCanceled = await Foo();
if (mightBeCanceled.IsCanceled)
; // Take canceled action
else
; // Take normal action
}
लेकिन यह लगता है (मैं संक्षिप्तता यहाँ के लिए कुछ अच्छे कोडिंग और शैली प्रथाओं पर ध्यान नहीं दिया गया है):
मेरे अगली सबसे अच्छा विकल्प एक संरचना है कि यह खुद IsCanceled संपत्ति है है वापस जाने के लिए है अनावश्यक और उपयोग करने में कठोर। उल्लेख नहीं है कि यह स्थिरता की समस्याओं का परिचय देता है क्योंकि दो IsCanceled (टास्क में से एक और MightBeCanceled में से एक) होगा।
फू को कौन रद्द कर रहा है? इसे रद्द करने के लिए केवल कॉलर द्वारा रद्दीकरण किया जाना चाहिए –