C#:在并行线程中设置HttpContext.Current有什么问题吗?

Joh*_*ika 6 c# asp.net multithreading task-parallel-library facebook-c#-sdk

我正在使用一个依赖于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;
    }
});
Run Code Online (Sandbox Code Playgroud)

你预见到这有什么不对吗?这样做有什么影响吗?

Sal*_*iti 4

对我来说似乎还可以。使用 try ...finally 也是一个好点,因为线程可以重用,并且可以使上下文长时间保持活动状态,避免垃圾收集。不要认为还有其他方法可以解决这个问题。

但请注意,您调用的 api 不会在此多线程环境中产生问题。并非所有执行涉及写入/读取某些缓存值的写入操作或读取操作的代码都是线程安全的。

还要小心,如果字段值不是易失性的或者未使用 System.Threading.Interlocked,则字段值无法正确和/或及时地从一个线程传播到另一个线程!这可能会给您带来问题,尤其是在发布版本中。

但是,您可以使用 Thread.MemoryBarrier 或锁定,在网络上搜索这个烦人(但不可避免)的问题。