ответ

4

Я создал несколько методов расширения, которые соответствовали ContinueWith и StartNew кроме того, что они также принимают дополнительный 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

Связанные Вопрос:

+0

когда вы говорите, восстановите 'ожидаемый SynchronizationContext', каков ожидаемый SynchronizationContext. Не могли бы вы привести пример использования этих расширений? – user1

+1

@ user1 Я имею в виду восстановление текущего 'SynchronizationContext' до того, что было бы без ошибки. Так, например, в Winforms основной поток обычно имеет «WindowsFormsSynchronizationContext», установленный как текущий. С ошибкой в ​​продолжении текущий SynchronizationContext будет иметь значение null. С этим обходным решением это будет 'WindowsFormsSynchronizationContext', как и должно быть. –

+0

Спасибо за ответ, обходное решение отлично работает. Раздражающая Microsoft закрыла эту ошибку, поскольку она не могла воспроизвести. Интересно, пытались ли они воспроизвести его – user1

Смежные вопросы