首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

多线程的有关问题,请达人帮忙

2013-01-28 
多线程的问题,请达人帮忙。我在程序里开了五百个线程,结果在想捕捉线程结束并退出的地方遇到了问题。我明明

多线程的问题,请达人帮忙。
我在程序里开了五百个线程,结果在想捕捉线程结束并退出的地方遇到了问题。

我明明开了五百个线程,全都是调用同一个sub,比较长,并在退出的时候,进行了捕捉,结果我发现,启动五百个线程,结束的时候,只发现了385个是正常退出,然后程序就没动静了,也就是说,还有115个线程,自己不知道什么时候自己挂掉了!!!

我不知道如何处理了,那个sub比较长,涉及到好几种不种的操作,有网页,有数据库,就不贴出详细代码了。

我就是不明白,线程会在何种情况下,自己挂掉,对这种自己挂掉的线程,应该通过什么方法来捕捉呢。

另:在这些线程里面,为了控制一个相同的数据集,我使用了一个DO LOOP的循环来阻塞线程,这个循环是无限的,直到一个变量为TRUE才往下走,感觉会不会这里出了问题。如果是的话,应该采取何种方法来阻塞线程呢。。。。。谢谢指点。。
[解决办法]
在sub最后加个count++,看看count是多少
[解决办法]


  public class WorkHelper : IDisposable
    {
        int totalCounts;
        ManualResetEvent mre;

        public WorkHelper(int totalWorkCounts)
        {
            mre = new ManualResetEvent(false);
            totalCounts = totalWorkCounts + 1;
        }

        public void CountDown()
        {
            if (Interlocked.Decrement(ref totalCounts) <= 0)
            {
                mre.Set();
            }
        }

        public void WaitAll()
        {
            CountDown();
            mre.WaitOne();
        }



        #region IDisposable 成员

        void IDisposable.Dispose()
        {
            ((IDisposable)mre).Dispose();
        }

        #endregion
    }
~~~
using(WorkHelper wh=new WorkHelper(500))
{
 for(int i=0;i<500;i++)
 {
  ThreadPool.QueueUserWorkItem(_=>{
   //bla, bla, bla....
   wh.CountDown();
 });
  wh.WaitAll();
 }
 //final exit 
}


[解决办法]
就是多线程同步问题
因为XCNum = XCNum - 1,这个非线程安全。
分步骤来处理
首先确保500线程创建都成功
然后再保障线程退出时线程数自减原子操作

热点排行