KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I need to call an async method in a catch block before throwing again the exception (with its stack trace) like this : try { // Do something } catch { // <- Clean things here with async methods throw; } But unfortunately you can't use await in a catch or finally block. I learned it's because the compiler doesn't have any way to go back in a catch block to execute what is after your await instruction or something like that... I tried to use Task.Wait() to replace await and I got a deadlock. I searched on the Web how I could avoid this and found this site . Since I can't change the async methods nor do I know if they use ConfigureAwait(false) , I created these methods which take a Func<Task> that starts an async method once we are on a different thread (to avoid a deadlock) and waits for its completion: 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()); } So my questions is: Do you think this code is okay? Of course, if you have some enhancements or know a better approach, I'm listening! :)
Tags (comma-separated)
Save Edits
Cancel