.Net中多線程管理的一種方法(C#)

2010-08-28 10:50:18來源:西部e網(wǎng)作者:

目的

希望能時(shí)刻監(jiān)視程序所開的所有線程的執(zhí)行進(jìn)度,隨時(shí)對(duì)這些線程進(jìn)行操作。


研究如何實(shí)現(xiàn)

今天我研究半天如何管理多線程,就像FlashGet那樣能夠知道一個(gè)文件(線程)什么時(shí)候下載結(jié)束正在干什么下載了多少等等。

我希望能時(shí)刻監(jiān)視我這些線程的執(zhí)行進(jìn)度,隨時(shí)對(duì)這些線程進(jìn)行操作。但是應(yīng)該用什么函數(shù)來實(shí)現(xiàn)呢?

根據(jù)現(xiàn)在已經(jīng)掌握得不多的線程知識(shí),我寫了一種比較不理想但能實(shí)現(xiàn)管理線程的方法。就是有的時(shí)候容易假死,因?yàn)槎〞r(shí)器是在主線程中執(zhí)行的。如果網(wǎng)友朋友有什么比較好的管理方法的話還望賜教。


實(shí)現(xiàn)核心代碼簡(jiǎn)介

聲明公共變量

ArrayList ThreadList = new ArrayList();


首先啟動(dòng)定時(shí)器,檢測(cè)線程狀態(tài)

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

開線程,開10個(gè)吧,把每一個(gè)線程的作為一個(gè)對(duì)象存進(jìn)ThreadList,然后把相應(yīng)的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();
            }


重頭戲,定時(shí)器檢測(cè)所有的線程狀態(tài),如果該線程停止了,則在listview中顯示停止,并且再在ThreadList中刪除該對(duì)象!

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--);
                 }
            }

        } 


圖片簡(jiǎn)介


遺憾

該方法顯然效率不夠最優(yōu)化,不適合超龐大的線程群,不過一般小問題也就夠了哈~~~

關(guān)鍵詞:C#