Что такое обходной путь для проблемы, когда SynchronizationContext.Current
неожиданно является null в основном потоке .NET 4.0? См:Обход проблемы для .NET 4.0, где SynchronizationContext.Current является нулевым
4
A
ответ
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
Связанные Вопрос:
Смежные вопросы
- 1. граф, где не является нулевым
- 2. Кэширование MVC .NET 4.0
- 3. Справочные проблемы в .NET 4.0 для .NET 2.0 dll/project
- 4. переменная .NET Session является нулевым - для всех пользователей
- 5. Svcutil.exe для .NET 4.0?
- 6. Как SynchronizationContext.Current основного потока становится нулевым в приложении Windows Forms?
- 7. Запрос GQL, где поле не является нулевым
- 8. Spring запроса данных, где столбец является нулевым
- 9. LINQ игнорировании где, если SomeObject является нулевым
- 10. WPF XAML StringFormat: Обход проблемы в C# 4.0?
- 11. Проблемы безопасности .NET 4.0 XBAP с GAC
- 12. Проблемы с управлением Ajax на .NET 4.0
- 13. Проблемы с Javascript после преобразования .NET 4.0
- 14. Get-AdUser, где mail не является нулевым
- 15. Серьезные проблемы с ILMerge и .NET 4.0
- 16. Является ли WebProtocolException включенным в .net 4.0?
- 17. Microsoft.BingAds.SDK для .NET 4.0
- 18. Как развернуть полное приложение .Net 4.0 для среды, которая является просто клиентом Net 4.0?
- 19. Где находится System.Linq в .NET 4.0?
- 20. Где счетчики производительности .NET 4.0 MemoryCache?
- 21. Проект установки: где .net framework 4.0 скрыт?
- 22. Почему SynchronizationContext.Current null в приложении Winforms?
- 23. Автономный .NET CLR Debugger для .NET 4.0?
- 24. команда SQL для извлечения данных, где один столбец является нулевым
- 25. Оператор case для 'где [значение] не является нулевым'
- 26. Устранены проблемы с производительностью Linq для объектов в .NET 4.0?
- 27. SynchronizationContext.Current в async обратном вызове
- 28. .Net 4.0 и .Net 4.5
- 29. FormsAuthenticationTicket является нулевым
- 30. C# Тема в теме: как получить SynchronizationContext.Current?
когда вы говорите, восстановите 'ожидаемый SynchronizationContext', каков ожидаемый SynchronizationContext. Не могли бы вы привести пример использования этих расширений? – user1
@ user1 Я имею в виду восстановление текущего 'SynchronizationContext' до того, что было бы без ошибки. Так, например, в Winforms основной поток обычно имеет «WindowsFormsSynchronizationContext», установленный как текущий. С ошибкой в продолжении текущий SynchronizationContext будет иметь значение null. С этим обходным решением это будет 'WindowsFormsSynchronizationContext', как и должно быть. –
Спасибо за ответ, обходное решение отлично работает. Раздражающая Microsoft закрыла эту ошибку, поскольку она не могла воспроизвести. Интересно, пытались ли они воспроизвести его – user1