.NET 4.0中SynchronizationContext.Current为null的问题解决方法

4
1个回答

4

我创建了几个扩展方法,与ContinueWithStartNew匹配,除了它们还接受一个额外的SyncronizationContext参数。然后,我使用此参数在执行操作之前恢复了预期的SynchronizationContext

以下是示例:

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);
    }
}

我随后使用这些扩展方法代替.ContinueWith.StartNew

相关问题:


当你说要恢复“预期的同步上下文”时,预期的同步上下文是什么?您能举个例子说明如何使用这些扩展吗? - JKennedy
1
@user1 我的意思是将当前的“SynchronizationContext”恢复到没有错误时的状态。例如,在Winforms中,主线程通常会安装一个“WindowsFormsSynchronizationContext”作为当前上下文。有了这个错误,在继续执行时,当前的SynchronizationContext将为null。通过这个解决方法,它将是应该的“WindowsFormsSynchronizationContext”。 - Matt Smith
谢谢回复,解决方法非常好用。很烦人的是微软将此错误标记为无法重现。我想知道他们是否真的尝试过重现它。 - JKennedy
@user1,他们在.NET 4.5中将其关闭为“不可重现”(这是真的)。由于.NET 4.5已经发布,我无法针对.NET 4.0记录错误日志。 - Matt Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接