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

1

4

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

Doable answered 6/1, 2014 at 15:29 Comment(0)
D
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:

Doable answered 6/1, 2014 at 15:29 Comment(4)
when you say restore the expected SynchronizationContext what is the expected SynchronizationContext. Could you give an example of how to use these extensions?Lapierre
@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 itLapierre
@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.