目的
希望能时刻监视程序所开的所有线程的执行进度,随时对这些线程进行操作。
研究如何实现
今天我研究半天如何管理多线程,就像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--);
}
}
}
图片简介
遗憾
该方法显然效率不够最优化,不适合超庞大的线程群,不过一般小问题也就够了哈~~~