Session变量是否在ASP.Net页面的Parallel.For循环中是线程安全的

时间:2014-07-28 03:03:11

标签: asp.net multithreading c#-4.0 task-parallel-library

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

此代码是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?
        } 
       ); 
   }

1 个答案:

答案 0 :(得分:3)

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

因此,在某些情况下,如果你打电话是安全的。

如果您仅从您的网页中将其称为,则可以在不同的网页上安全使用。 原因是会话从页面加载开始到结束完全锁定会话。

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

Web app blocked while processing another web app on sharing same session
Does ASP.NET Web Forms prevent a double click submission?
Trying to make Web Method Asynchronous

如果您从同一页多次调用,从不同的主题调用,则需要同步

备注

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