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)
你预见到这有什么不对吗?这样做有什么影响吗?
对我来说似乎还可以。使用 try ...finally 也是一个好点,因为线程可以重用,并且可以使上下文长时间保持活动状态,避免垃圾收集。不要认为还有其他方法可以解决这个问题。
但请注意,您调用的 api 不会在此多线程环境中产生问题。并非所有执行涉及写入/读取某些缓存值的写入操作或读取操作的代码都是线程安全的。
还要小心,如果字段值不是易失性的或者未使用 System.Threading.Interlocked,则字段值无法正确和/或及时地从一个线程传播到另一个线程!这可能会给您带来问题,尤其是在发布版本中。
但是,您可以使用 Thread.MemoryBarrier 或锁定,在网络上搜索这个烦人(但不可避免)的问题。
| 归档时间: |
|
| 查看次数: |
4771 次 |
| 最近记录: |