Thread[] threads = new Thread[3];//全局变量 private void button1_Click(object sender, EventArgs e) { for ( int i=0;i<threads.Length;i++) { threads[i] = new Thread(delegate() { Test(i.ToString()); }); threads[i].Start(); } } void Test(string hwnd) { do { MessageBox.Show(hwnd); } while (true); } //threads[1],threads[2] 该干嘛就干嘛
我来完善10L的例子:Thread[] threads = new Thread[3];//全局变量 private void button1_Click(object sender, EventArgs e) { for ( int i=0;i<threads.Length;i++) { threads[i] = new Thread(delegate() { Test(i.ToString()); }); threads[i].Start(); } } void Test(string hwnd) { try { do { MessageBox.Show(hwnd); } while (true); } catch(ThreadAbortException e) { //在这里释放资源 Thread.ResetAbort(); } } //这样就可以终止1号线程, threads[1].Abort();
新建一个类,这个类的字段是你用于控制线程必要字段。 每个类的对象对应一个线程。 因为C#中类的对象是引用,所以很方便了,这样吧, 我写个简单点的。 class A { public bool breakFlag = false; public int thread_Index = -1; } 有一个全局的List<A> lst; 下面是启动线程: for(int i =0 ; i < 3; i ++) { A a = new A(); a.thread_Index = i; Thread th = new Thread(delegate() { Test(i.ToString()); }); lst.add(a); } 下面是你的test函数 void test(string index) { A a = lst.find(l=>l.thread_Index == int.parse(index)); if(a == null) throw new exception();
是用户根据自己的情况,停止特定线程,我声明对象的时候都是 Thread th = new Thread(delegate() { Test(i.ToString()); });
那我 th.join() 不能单一停止某一个线程吧。
private void button1_Click(object sender, EventArgs e)
{
for ( int i=0;i<threads.Length;i++)
{
threads[i] = new Thread(delegate() { Test(i.ToString()); });
threads[i].Start();
}
} void Test(string hwnd)
{
do
{
MessageBox.Show(hwnd);
} while (true);
}
//threads[1],threads[2] 该干嘛就干嘛
private void button1_Click(object sender, EventArgs e)
{
for ( int i=0;i<threads.Length;i++)
{
threads[i] = new Thread(delegate() { Test(i.ToString()); });
threads[i].Start();
}
} void Test(string hwnd)
{
try
{
do
{
MessageBox.Show(hwnd);
} while (true);
}
catch(ThreadAbortException e)
{
//在这里释放资源
Thread.ResetAbort();
} }
//这样就可以终止1号线程,
threads[1].Abort();
每个类的对象对应一个线程。
因为C#中类的对象是引用,所以很方便了,这样吧, 我写个简单点的。
class A
{
public bool breakFlag = false;
public int thread_Index = -1;
}
有一个全局的List<A> lst;
下面是启动线程:
for(int i =0 ; i < 3; i ++)
{
A a = new A();
a.thread_Index = i;
Thread th = new Thread(delegate() { Test(i.ToString()); });
lst.add(a);
}
下面是你的test函数
void test(string index)
{
A a = lst.find(l=>l.thread_Index == int.parse(index));
if(a == null) throw new exception();
while(true)
{
if(a.breakFlag) return;
}
}
如果你需要暂停0这个线程,那么你在其他的地方把0对应的A的对象中的breakFlag设置为true就好了。
就是这样,如果你需要的是暂停,而不退出,那么在A类中添加一个autoresetEvent对象,使用方式如同breakFlag。如果你想不通为什么外面的lst可以操作线程中的a,那么你好好看看什么是引用,什么是值。
另外我不是很赞同直接操作thread的对象,毕竟让线程自然退出比你在外面使用abort要好很多,而且abort很多时候会出问题的。