मुझे इस तरह फिर से अपवाद (इसके स्टैक ट्रेस के साथ) को फेंकने से पहले asyncएक catchब्लॉक में एक विधि को कॉल करने की आवश्यकता है :
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
लेकिन दुर्भाग्य से आप awaitएक catchया finallyब्लॉक में उपयोग नहीं कर सकते । मैंने सीखा है क्योंकि संकलक के पास किसी भी तरह से वापस जाने के catchलिए ब्लॉक में जाने का कोई तरीका नहीं है जो आपके awaitनिर्देश के बाद है या ऐसा कुछ ...
मैंने Task.Wait()बदलने की कोशिश की awaitऔर मुझे गतिरोध मिल गया। मैंने वेब पर खोज की कि मैं इससे कैसे बच सकता हूं और यह साइट कैसे मिली ।
चूंकि मैं asyncतरीकों को बदल नहीं सकता और न ही मुझे पता है कि अगर वे उपयोग करते हैं ConfigureAwait(false), तो मैंने इन विधियों को बनाया जो Func<Task>एक अलग तरीके से शुरू होने के बाद एक async विधि शुरू करते हैं (एक गतिरोध से बचने के लिए) और इसके पूरा होने का इंतजार करते हैं:
public static void AwaitTaskSync(Func<Task> action)
{
Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}
public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}
public static void AwaitSync(Func<IAsyncAction> action)
{
AwaitTaskSync(() => action().AsTask());
}
public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
return AwaitTaskSync(() => action().AsTask());
}
तो मेरे सवाल हैं: क्या आपको लगता है कि यह कोड ठीक है?
बेशक, अगर आपके पास कुछ संवर्द्धन हैं या एक बेहतर दृष्टिकोण जानते हैं, तो मैं सुन रहा हूं! :)
awaitकैच ब्लॉक में उपयोग करना वास्तव में C # 6.0 के बाद से अनुमति है (मेरा उत्तर नीचे देखें)