首页 新闻 会员 周边

多线程及线程池崩溃

0
悬赏园豆:10 [已解决问题] 解决于 2016-01-15 15:52

我在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 或 链接也行

少时不知贵的主页 少时不知贵 | 初学一级 | 园豆:86
提问于:2016-01-08 10:33
< >
分享
最佳答案
0

用Task吧或者并行运算都可以

sm.AsParallel().ForAll(m=>{该干嘛干嘛});

收获园豆:6
吴瑞祥 | 高人七级 |园豆:29449 | 2016-01-08 10:37

您可以给个好的demo和链接没有,我刚好想学下网页并发 0.0

少时不知贵 | 园豆:86 (初学一级) | 2016-01-08 17:17

@杰哥要学习了: 我上面的代码不就是demo了.这个跟网页并发是两回事.不要扯到一起.

百度 .net parallel

吴瑞祥 | 园豆:29449 (高人七级) | 2016-01-08 18:55
其他回答(2)
0

代码没看出问题 (猜测一种是线程开的太多了 sm的总数有多少,2 方法里面资源锁问题)具体的把错误信息详细拿出来看看  try 一下 看看

收获园豆:2
s_p | 园豆:138 (初学一级) | 2016-01-08 16:47

1500的数据

支持(0) 反对(0) 少时不知贵 | 园豆:86 (初学一级) | 2016-01-08 17:15
0

HttpContext.Current.Response.Write非线程安全的,你那样执行肯定挂的。

收获园豆:2
Daniel Cai | 园豆:10424 (专家六级) | 2016-01-11 09:34

不好意思 还是不太懂?您有没有demo或链接参考 谢谢

支持(0) 反对(0) 少时不知贵 | 园豆:86 (初学一级) | 2016-01-15 13:42

@杰哥要学习了: 你CheckId这个方法你在多线程下调用,那么肯定会出现多个线程同时执行这个方法,也就是HttpResponse.Write方法,而这个Write实现本身会依赖于一个char的buffer(数组),多线程执行到这块肯定会出现问题(比如a线程进来检查的时候认为buffer没有满,继续写入,结果同时b进来写了两笔把buffer写满了导致a上出现异常)。

再退一步说,msdn基本每个地方都会加一句:framework中所有的静态方法都是线程安全的,但不保证实例方法的线程安全性。

所以你这块最后会出现异常,因此你需要在最后Write时做一次同步,比如简单的在那个write方法外套个lock就可以了。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-01-18 10:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册