What is a workaround for the issue where the SynchronizationContext.Current
is null unexpectedly on the main thread in .NET 4.0? See:
Asked
Active
Viewed 732 times
4

Community
- 1
- 1

Matt Smith
- 17,026
- 7
- 53
- 103
1 Answers
4
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:

Community
- 1
- 1

Matt Smith
- 17,026
- 7
- 53
- 103
-
when you say restore the `expected SynchronizationContext` what is the expected SynchronizationContext. Could you give an example of how to use these extensions? – JKennedy May 22 '15 at 07:49
-
1@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. – Matt Smith May 22 '15 at 14:56
-
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 – JKennedy May 22 '15 at 14:59
-
@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. – Matt Smith May 22 '15 at 15:00