Search code examples
c#winformstask-parallel-librarysynchronizationcontext

Workaround for issue in .NET 4.0 where SynchronizationContext.Current is null


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


Solution

  • 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: