C #: Что-то не так с настройкой HttpContext.Current в параллельном потоке? - PullRequest
6 голосов
/ 21 октября 2011

Я использую библиотеку, которая использует HttpContext.Current.Библиотека Facebook C # SDK, но мой вопрос должен быть применим и к другим сценариям.Я хотел бы использовать эту библиотеку из параллельного потока.Однако HttpContext.Current недоступен в параллельном потоке, поэтому я думаю о кешировании его в локальную переменную, а затем о настройке в параллельном потоке следующим образом:

var httpContext = HttpContext.Current;
Parallel.ForEach(items, item => {

    try {

        HttpContext.Current = httpContext;

        // Call a method that relies on HttpContext.Current

    } finally {
        HttpContext.Current = null;
    }
});

Вы предвидите что-нибудь не такс этим?Есть ли какие-либо последствия для этого?

1 Ответ

4 голосов
/ 21 октября 2011

Для меня, кажется, хорошо. Использование try ... finally также является хорошим моментом, поскольку поток можно использовать повторно, и вы можете поддерживать контекст в течение долгого времени, избегая сбора мусора. Не думайте, что есть другой способ решить эту проблему.

Однако будьте осторожны, чтобы вызываемый API не создавал проблем в этой многопоточной среде. Не весь код является потокобезопасным, выполняя операции записи или операции чтения, которые включают запись \ чтение некоторого кэшированного значения.

Будьте внимательны и к тому, что значения полей не могут передаваться правильно и \ или во времени из одного потока в другой, если они не являются изменчивыми или если System.Threading.Interlocked не используется! Это может создать вам проблемы, особенно в сборках релиза.

Однако вы можете использовать Thread.MemoryBarrier или lock, найти в Интернете эту досадную (но неизбежную) проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...