.Net中多线程管理的一种方法(C#)

2010-08-28 10:50:18来源:西部e网作者:

目的

希望能时刻监视程序所开的所有线程的执行进度,随时对这些线程进行操作。


研究如何实现

今天我研究半天如何管理多线程,就像FlashGet那样能够知道一个文件(线程)什么时候下载结束正在干什么下载了多少等等。

我希望能时刻监视我这些线程的执行进度,随时对这些线程进行操作。但是应该用什么函数来实现呢?

根据现在已经掌握得不多的线程知识,我写了一种比较不理想但能实现管理线程的方法。就是有的时候容易假死,因为定时器是在主线程中执行的。如果网友朋友有什么比较好的管理方法的话还望赐教。


实现核心代码简介

声明公共变量

ArrayList ThreadList = new ArrayList();


首先启动定时器,检测线程状态

timer1.Interval = 3000;
timer1.Start();

开线程,开10个吧,把每一个线程的作为一个对象存进ThreadList,然后把相应的ManagedThreadId存入listView1中

int n = 10;
            Thread[] kk = new Thread[n];
            for (int i = 0; i < n; i++)
            {
                kk[i] = new Thread(new ThreadStart(proc));
                ListViewItem item1 = new ListViewItem(kk[i].ManagedThreadId.ToString(), 0);
                item1.SubItems.Add("0");
                listView1.Items.Add(item1);
                ThreadList.Add(kk[i]);
                kk[i].Start();
            }


重头戏,定时器检测所有的线程状态,如果该线程停止了,则在listview中显示停止,并且再在ThreadList中删除该对象!

private void timer1_Tick(object sender, EventArgs e)
        {

            for (int i = 0; i < ThreadList.Count; i++)
            {
                Thread o = (Thread)ThreadList[i];
                if (o.ThreadState.ToString() == "Stopped")
                {
                    foreach (ListViewItem LVI in listView1.Items)
                    {
                        if (Convert.ToInt32(LVI.SubItems[0].Text) == o.ManagedThreadId)
                        {
                            LVI.SubItems[1].Text = "Stopped";
                        }
                    }
                    ThreadList.RemoveAt(i--);
                 }
            }

        } 


图片简介


遗憾

该方法显然效率不够最优化,不适合超庞大的线程群,不过一般小问题也就够了哈~~~

关键词:C#