我在web上编写:多线程批量登陆,获取网站信息,老是弹出IIS奔溃
1.获取账号信息集合
2,每个账号分配一个进程
测试代码:
private void upallscore() { ThreadPool.SetMaxThreads(10, 10); IEnumerable<ScoreM> sm = ScoreBLL.GetScoreAll().OrderBy(x => x.序号);//获取所有学员信息 foreach (var m in sm) { if (m.序号 != 0) { //方法一 线程 Thread t = new Thread(new ParameterizedThreadStart(CheckId)); t.Start(m.序号); //方法二 线程池 ThreadPool.QueueUserWorkItem(new WaitCallback(CheckId), m.序号); } } } //获取所有的分数
private static void CheckId(Object Id) { HttpContext.Current.Response.Write("this " + Id + " and thread = "+Thread.CurrentThread.ManagedThreadId+"<p/>"); }
方法一是直接丢线程,方法二是线程池,但是iis都如下图
如果大神有demo 或 链接也行
用Task吧或者并行运算都可以
sm.AsParallel().ForAll(m=>{该干嘛干嘛});
您可以给个好的demo和链接没有,我刚好想学下网页并发 0.0
@杰哥要学习了: 我上面的代码不就是demo了.这个跟网页并发是两回事.不要扯到一起.
百度 .net parallel
代码没看出问题 (猜测一种是线程开的太多了 sm的总数有多少,2 方法里面资源锁问题)具体的把错误信息详细拿出来看看 try 一下 看看
1500的数据
HttpContext.Current.Response.Write非线程安全的,你那样执行肯定挂的。
不好意思 还是不太懂?您有没有demo或链接参考 谢谢
@杰哥要学习了: 你CheckId这个方法你在多线程下调用,那么肯定会出现多个线程同时执行这个方法,也就是HttpResponse.Write方法,而这个Write实现本身会依赖于一个char的buffer(数组),多线程执行到这块肯定会出现问题(比如a线程进来检查的时候认为buffer没有满,继续写入,结果同时b进来写了两笔把buffer写满了导致a上出现异常)。
再退一步说,msdn基本每个地方都会加一句:framework中所有的静态方法都是线程安全的,但不保证实例方法的线程安全性。
所以你这块最后会出现异常,因此你需要在最后Write时做一次同步,比如简单的在那个write方法外套个lock就可以了。