asp.net如何控制多用户访问1个对象

时间:2022-08-29 11:53:24
protected void btn_Click(object sender, EventArgs a)
        {
            using (StreamWriter sw = new StreamWriter(@"C:\multThread.txt"))
            {
                sw.WriteLine(DateTime.Now.ToString());
            }
            lbl.Text = DateTime.Now.ToString() + " " + Session.SessionID.ToString()+" "+
                System.Diagnostics.Process.GetCurrentProcess().Threads.Count;
        }
在sw.WriteLine设断点。在3个不同浏览器点击按钮。进入会有1个因进程正在使用,而无法访问。
我是故意这样做的,为了测试一下asp.net的多线程控制?
那,asp.net是如和控制多用户访问的呢?若一个用户在占用文件,而另一个要访问,是应该等待?它是否开启另外的线程?
若并发2000用户,开启2000个线程吗?那不久崩溃了吗?谁懂得其中道理,不惜赐教。

16 个解决方案

#1


每天回帖即可获得10分可用分!

#2


若在using中加入Thread.sleep(10000)
那么在10秒内若有其它用户访问,会保存,刚刚试过。谁能解释一下原理。

#3


StreamWriter sw = new StreamWriter(@"C:\multThread.txt");
作为一个全局变量。
不要close
在服务器关闭事件中写close

#4


如果你的并发不会很多的话,可以用lock住..
等代码执行完毕了,在进行解锁!
如果线程并发高,使用以下这个方法:
 private int inTimer = 0;
        private void timersTimer_Elapsed(object source)
        {
            if (Interlocked.Exchange(ref inTimer, 1) == 0)
            {
              //你要执行的代码
               // 在代码最后加上++
               //线程原子操作,保证线程安全
                Interlocked.Exchange(ref inTimer, 0);
            }
         }

#5


引用楼主 wcl1986_1 的回复:
我是故意这样做的,为了测试一下asp.net的多线程控制?


你这是故意测试asp.net多线程访问?你这是故意测试多线程写同一个文件!(而Windows操作系统根本不允许进行这种操作)

因此,问题出在你做的所谓测试。如果你用一个最简单的console试试多线程写同一个文件,肯定也一样发生冲突!难道你因此就怀疑console下能不能多线程操作?

#6


3,4楼说的确实是对的。那超时怎么设置?

#7


sp1234,不是的。我是想看看asp,net多线程的机制。这样做确实不妥,但是可以明显看出asp.net是对用户请求,在并发时,是否采用多线程,。结论,当然是的。但是它真的是在并发时,每个请求开一个线程吗?

#8


其实你应该注意这个问题背后的所显现的深层次问题。你对多线程的实践经验实在是太少了,这就造成了自己给自己设计出了根本不可能有正确结果的“陷阱”。

#9


引用 7 楼 wcl1986_1 的回复:
sp1234,不是的。我是想看看asp,net多线程的机制。这样做确实不妥,但是可以明显看出asp.net是对用户请求,在并发时,是否采用多线程,。结论,当然是的。但是它真的是在并发时,每个请求开一个线程吗?


你的
    
    sw.WriteLine(DateTime.Now.ToString());

运行多长时间?10秒钟吗?

#10


呵呵 不惜请教 

#11


System.Threading.Thread.Sleep(10000);
            lbl.Text = DateTime.Now.ToString() + " " + Session.SessionID.ToString()+" 线程数:"+
                System.Diagnostics.Process.GetCurrentProcess().Threads.Count;
这样测试,能看出,在10秒内,出现多个请求,会出现。18个线程,而一个请求是16个,2个是17个

#12


那也就是说,在asp.net中若并发2000个的话,开2000个线程。我以前测试过,系统开2000个线程,会内存溢出。那真的是大网站的话,怎么办呢?

#13


并发2000个线程对1个文件进行写入操作吗?
我感觉这样的情况一概很少见吧。学习ing。。。

#14


顶顶顶顶顶顶顶

#15


web天生就是多线程。不明白要测试什么?

#16


使用单态设计模式

#1


每天回帖即可获得10分可用分!

#2


若在using中加入Thread.sleep(10000)
那么在10秒内若有其它用户访问,会保存,刚刚试过。谁能解释一下原理。

#3


StreamWriter sw = new StreamWriter(@"C:\multThread.txt");
作为一个全局变量。
不要close
在服务器关闭事件中写close

#4


如果你的并发不会很多的话,可以用lock住..
等代码执行完毕了,在进行解锁!
如果线程并发高,使用以下这个方法:
 private int inTimer = 0;
        private void timersTimer_Elapsed(object source)
        {
            if (Interlocked.Exchange(ref inTimer, 1) == 0)
            {
              //你要执行的代码
               // 在代码最后加上++
               //线程原子操作,保证线程安全
                Interlocked.Exchange(ref inTimer, 0);
            }
         }

#5


引用楼主 wcl1986_1 的回复:
我是故意这样做的,为了测试一下asp.net的多线程控制?


你这是故意测试asp.net多线程访问?你这是故意测试多线程写同一个文件!(而Windows操作系统根本不允许进行这种操作)

因此,问题出在你做的所谓测试。如果你用一个最简单的console试试多线程写同一个文件,肯定也一样发生冲突!难道你因此就怀疑console下能不能多线程操作?

#6


3,4楼说的确实是对的。那超时怎么设置?

#7


sp1234,不是的。我是想看看asp,net多线程的机制。这样做确实不妥,但是可以明显看出asp.net是对用户请求,在并发时,是否采用多线程,。结论,当然是的。但是它真的是在并发时,每个请求开一个线程吗?

#8


其实你应该注意这个问题背后的所显现的深层次问题。你对多线程的实践经验实在是太少了,这就造成了自己给自己设计出了根本不可能有正确结果的“陷阱”。

#9


引用 7 楼 wcl1986_1 的回复:
sp1234,不是的。我是想看看asp,net多线程的机制。这样做确实不妥,但是可以明显看出asp.net是对用户请求,在并发时,是否采用多线程,。结论,当然是的。但是它真的是在并发时,每个请求开一个线程吗?


你的
    
    sw.WriteLine(DateTime.Now.ToString());

运行多长时间?10秒钟吗?

#10


呵呵 不惜请教 

#11


System.Threading.Thread.Sleep(10000);
            lbl.Text = DateTime.Now.ToString() + " " + Session.SessionID.ToString()+" 线程数:"+
                System.Diagnostics.Process.GetCurrentProcess().Threads.Count;
这样测试,能看出,在10秒内,出现多个请求,会出现。18个线程,而一个请求是16个,2个是17个

#12


那也就是说,在asp.net中若并发2000个的话,开2000个线程。我以前测试过,系统开2000个线程,会内存溢出。那真的是大网站的话,怎么办呢?

#13


并发2000个线程对1个文件进行写入操作吗?
我感觉这样的情况一概很少见吧。学习ing。。。

#14


顶顶顶顶顶顶顶

#15


web天生就是多线程。不明白要测试什么?

#16


使用单态设计模式