मुझे इस तरह फिर से अपवाद (इसके स्टैक ट्रेस के साथ) को फेंकने से पहले 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 के बाद से अनुमति है (मेरा उत्तर नीचे देखें)