会话变量在ASP.Net页中的并行.For循环中是线程安全的吗

会话变量在ASP.Net页中的并行.For循环中是线程安全的吗,asp.net,multithreading,c#-4.0,task-parallel-library,Asp.net,Multithreading,C# 4.0,Task Parallel Library,在下面的代码中更改会话变量(即会话[“进度”])是否安全 此代码是ASP.Net页面代码隐藏的一部分 当并行运行一个循环时,两个迭代可能同时运行,如果两个迭代都更改了相同的会话变量,则会导致问题 public void LongOperation() { Parallel.For(0, totalMembers,(i,loopState) => { Thread.Sleep(2000);//wait some time

在下面的代码中更改会话变量(即会话[“进度”])是否安全

此代码是ASP.Net页面代码隐藏的一部分

当并行运行一个循环时,两个迭代可能同时运行,如果两个迭代都更改了相同的会话变量,则会导致问题

   public void LongOperation()
    {
        Parallel.For(0, totalMembers,(i,loopState) =>
        {
            Thread.Sleep(2000);//wait some time to simulate processing
            progress++;
            Session["Progress"] = progress;//IS THIS THREAD-SAFE?
        } 
       ); 
   }

这不是线程安全的,但是跨不同打开页面的会话可以安全地更改

所以在某些情况下,如果你叫它是安全的

如果您在页面中只调用了一次,则在不同页面之间是安全的。 原因是会话从页面加载开始到结束都是完全锁定的

一些类似的答案证明了这一点



如果您从同一页面、不同线程多次调用它,那么您需要同步

笔记
  • 如果此循环需要很长时间才能完成,则所有用户都将等待 这不仅是会话用户的计算。所有用户都将被会话锁锁定。如果有太多的用户打电话,那么所有的用户将一起等待很长时间。因此,您可能需要对调度程序任务进行此计算
  • 如果处理循环内部数据的时间小于创建和同步线程所需的时间,则并行循环比简单循环需要更多的时间来完成。所以你需要计算简单循环和并行循环的速度

文档说明实例方法不是线程安全的。为什么要进行并行工作,您是否考虑过它将如何使用用于asp.net请求的线程?为了确保它是正确的,您可以始终为locking@SimonSvensson,看看这里,会话状态似乎是线程安全的:@SimonSvensson,在ASP.Net中并行循环不可取吗?我认为,并行将根据可用的CPU、内存和线程自动优化自身,因此我可以使用它而不会有太多风险。@Sunil,在“任何时候只有一个http请求写入会话”的上下文中,会话状态是线程安全的。如果您启动自己的线程访问它,那么就没有线程安全性。Parallel stuff通常使用线程池进行调度,与asp.net请求使用的线程相同,因此减少了可用于传入http请求的线程。你能告诉我们为什么你觉得需要平行的东西吗?你想解决什么问题?