2015-04-22 5 views
8

У меня есть веб-сервер C#, который я профилировал с помощью мини-фильтра StackOverflow. Поскольку это не сервер ASP.NET, но каждый запрос, как правило, выполнялся в своем потоке, я привязал минипрофилер к использованию хранилища ThreadStatic для отслеживания всех профилировщиков входящего запроса от начала до конца. Это сработало хорошо.Передача данных между потоками ThreadPool

Недавно мы конвертируемся все, чтобы использовать async/await, что означает продолжения после await обычно не приходят обратно на то же Thread и, таким образом ThreadStatic хранения больше не работает.

Каков наилучший способ передачи небольшого фрагмента данных между различными потоками ThreadPool в этом случае? Существуют ли существующие версии SynchronizationContext, которые были бы полезны для чего-то вроде этого?

+0

Какая версия рамок вы используете? –

+0

Извините, должен был упомянуть об этом. Я работаю с 4.5. – Cuthbert

ответ

8

Каков наилучший способ передачи небольшого фрагмента данных между различными потоками ThreadPool в этом случае?

Использование контекста логического вызова через класс CallContext. Он предоставляет два статических метода: LogicalSetData и LogicalGetData. Контекст вызова сохраняется и выстраивали через ExecutionContext, который также отвечает за синхронизации контекста и т.д.

Используя этот класс имеет два ограничения:

  1. Вы ограничены в использовании. NET 4.5 и выше

  2. Контекст логического вызова использует семантику копирования-на-запись и выполняет мелкую копию после изменения данных. Это означает, что вы должны использовать только неизменяемые данные, поскольку ссылки могут быть разделены между несколькими потоками.

Последнее, что нужно отметить: CallContext инициализируется только после его вызова. Это означает, что при его использовании вы получаете некоторые накладные расходы из-за копирования на запись.

Подробнее об этом можно найти в сообщение от Stephan Клири называется Implicit Async Context

+3

Точно, что я искал, спасибо. – Cuthbert

+0

@ Катберт Рад помочь. –

+0

Благодарим за то, что указали на неглубокую копию и неизменяемые требования к данным. – angularsen

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