4

What is a workaround for the issue where the SynchronizationContext.Current is null unexpectedly on the main thread in .NET 4.0? See:

Community
  • 1
  • 1
Matt Smith
  • 17,026
  • 7
  • 53
  • 103

1 Answers1

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