जब async
विधि प्रारंभ की गई है, तो यह वर्तमान सिंक्रनाइज़ेशन संदर्भ को कैप्चर करता है। इस समस्या को हल करने का एक तरीका है अपना स्वयं का सिंक्रनाइज़ेशन संदर्भ बनाना जो अपवाद को कैप्चर करता है।
public class AsyncSynchronizationContext : SynchronizationContext
{
public override void Send(SendOrPostCallback d, object state)
{
try
{
d(state);
}
catch (Exception ex)
{
// Put your exception handling logic here.
Console.WriteLine(ex.Message);
}
}
public override void Post(SendOrPostCallback d, object state)
{
try
{
d(state);
}
catch (Exception ex)
{
// Put your exception handling logic here.
Console.WriteLine(ex.Message);
}
}
}
आप ऊपर catch
में अपने अपवाद हैंडलिंग तर्क रख सकते हैं:
यहां मुद्दा यह है कि तुल्यकालन संदर्भ पदों थ्रेड पूल के लिए कॉलबैक, लेकिन यह चारों ओर आज़माएं/कैच के साथ है।
इसके बाद, हर धागा (SynchronizationContext.Current
[ThreadStatic]
है) जहाँ आप इस तंत्र के साथ async
तरीकों पर अमल करना चाहते हैं पर, आप वर्तमान समन्वयन संदर्भ सेट करना होगा:
SynchronizationContext.SetSynchronizationContext(new AsyncSynchronizationContext());
पूरा Main
उदाहरण:
class Program
{
static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new AsyncSynchronizationContext());
ExecuteAsyncMethod();
Console.ReadKey();
}
private static async void ExecuteAsyncMethod()
{
await AsyncMethod();
}
private static async Task AsyncMethod()
{
throw new Exception("Exception from async");
}
}
स्रोत
2012-09-07 08:25:53
यदि एक async विधि का इंतजार है, तो अपवाद उस कोड में फेंक दिया गया है जो इसका इंतजार कर रहा है। अनचाहे अपवाद इस तरह से व्यवहार करते हैं यदि विधि 'शून्य' लौट रही है। जितना संभव हो सके 'async शून्य' विधियों का उपयोग करने से बचने का यह एक कारण है। – svick
@svick 'async void' विधियों का निर्धारण निर्धारक व्यवहार में होता है; एक 'टास्क'-रिटर्निंग फ़ंक्शन को कॉल करना जिसके परिणामस्वरूप अपवाद होता है और कार्य का इंतजार नहीं करता है, भविष्य में कुछ सेमिनारम बिंदु पर 'UnobservedTaskException' ईवेंट को बढ़ाएगा जब कचरा कलेक्टर चलता है, और यदि ऐसा कुछ नहीं करता है, तो प्रोग्राम चुपचाप जारी रहेगा अगर सब ठीक है। समस्या 'async शून्य' विधियों के साथ नहीं है, वे केवल वास्तविक समस्या का पर्दाफाश करते हैं। यदि आप 'async' विधि से 'कार्य'-रिटर्निंग फ़ंक्शन को कॉल नहीं करते हैं, तो एक अच्छा मौका है कि आप कुछ गलत कर रहे हैं। – hvd
वैसे, केवल "अच्छा मौका" क्योंकि कुछ असाधारण (कोई इरादा नहीं है) मामले हैं जहां अपवादों को त्यागना ठीक है, लेकिन पूरी तरह से नहीं। – hvd