What is a workaround for the issue where the SynchronizationContext.Current
is null unexpectedly on the main thread in .NET 4.0? See:
Workaround for issue in .NET 4.0 where SynchronizationContext.Current is null
Asked Answered
I created several extension methods that matched ContinueWith
and StartNew
except that they also take an additional SyncronizationContext
. I then use this argument to restore the expected SynchronizationContext
before executing the action:
Below, I've given examples:
public static class TaskExtensionMethods
{
public static Task ContinueWith_UsingSyncContextWorkaround(this Task task, Action<Task> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler, SynchronizationContext sc)
{
Action<Task> actionWithWorkaround = t =>
{
SynchronizationContext.SetSynchronizationContext(sc);
continuationAction(t);
};
return task.ContinueWith(actionWithWorkaround, cancellationToken, continuationOptions, scheduler);
}
public static Task StartNew_UsingSyncContextWorkaround(this TaskFactory taskFactory, Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler, SynchronizationContext sc)
{
Action actionWithWorkaround = () =>
{
SynchronizationContext.SetSynchronizationContext(sc);
action();
};
return taskFactory.StartNew(actionWithWorkaround, cancellationToken, creationOptions, scheduler);
}
}
I then use these extension methods in place of .ContinueWith
or .StartNew
Related Question:
@user1 I mean restoring current
SynchronizationContext
to what it would be without the bug. So, for example, in Winforms, the main thread would typically have a WindowsFormsSynchronizationContext
installed as current. With the bug, in a continuation the current SynchronizationContext would be null. With this workaround it will be the WindowsFormsSynchronizationContext
as it should be. –
Doable Thanks for the reply the workaround works great. Annoying Microsoft closed this bug as could not reproduce. I wonder if they even tried to reproduce it –
Lapierre
@user1, they closed it as "not reproducible" in .NET 4.5 (which is true). There wasn't a way for me to log the bug against .NET 4.0 since .NET 4.5 was already out at the time. –
Doable
© 2022 - 2024 — McMap. All rights reserved.
expected SynchronizationContext
what is the expected SynchronizationContext. Could you give an example of how to use these extensions? – Lapierre