目的
希望能時(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)化,不適合超龐大的線程群,不過一般小問題也就夠了哈~~~