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

标签 c# asp.net multithreading facebook-c#-sdk task-parallel-library

我正在使用依赖于 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;
    }
});

你预见到这有什么问题吗?这样做有什么影响吗?

最佳答案

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

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

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

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

关于C#:在并行线程中设置 HttpContext.Current 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851532/

相关文章:

c# - 在 C# 中为 List<dynamic> 使用 NULL 局部变量

multithreading - 我应该在 Clojure 中使用哪一个?去 block 或线程?

c++ - 是否将 unique_lock 用于可以由 lock_guard 完成的任务较慢?

c# - 变量名 '@VarName' 已经被声明 Issue

c# - 是否有或将会有专门为托管代码设计的硬件?

c# - 用于显示发件人图片的 Outlook 插件(在 C# 中)

c# - 在页面之间保留对象列表 - ASP MVC

c# - 如何正确加载程序集

c# - 将字符串转换为时间并再次返回

python - 使用并行处理计算 2D 中每对点之间的距离