Комментарии 7
Скажите, а зачем вам возвращатся в тот поток из которого вызывали, если это не UI поток?
+2
Ну разве что кто-то запустит непотокобезопасный код. Мне просто было интересно все это воспроизвести, практической пользы от этого мало.
+2
Чтобы
await
в консольном приложении работал, как ожидается, например.+1
Я сталкивался со следующей проблемой, когда надо было сделать несколько асинхронных вызовов к базе с помощью EF в ASP.NET приложении.
Суть проблемы в том, что контекст EF не является потокобезопасным, и более того он генерирует исключение, если обращение к контексту было создано из другого потока. В тоже время асинхронность вызова в ASP.NET подразумевает использование AspNetSynchronizationContext, который в свою очередь использует пул потоков, а это значит, что вызовы к контексту EF могут происходить из разных потоков. Поэтому в такой ситуации собственный SynchronizationContext не повредил бы.
Суть проблемы в том, что контекст EF не является потокобезопасным, и более того он генерирует исключение, если обращение к контексту было создано из другого потока. В тоже время асинхронность вызова в ASP.NET подразумевает использование AspNetSynchronizationContext, который в свою очередь использует пул потоков, а это значит, что вызовы к контексту EF могут происходить из разных потоков. Поэтому в такой ситуации собственный SynchronizationContext не повредил бы.
+2
Мне кажется в предложенном решении есть race condition. Если новая задача прилетит между выполнением двух строк, то прилетевшая задача не выполнится пока не придёт следующая задача:
_eventReset.Reset();
_eventReset.WaitOne();
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Публикации
Изменить настройки темы
Пишем свой SynchronizationContext