我有按钮调用此代码
private void but_Click(object sender, EventArgs e)
{
Thread My_Thread = new Thread(() => Send_File());
My_Thread.IsBackground = true;
My_Thread.Start();
}
我想要一种方法来杀死
My_Thread
来自函数
由send_file()
请帮我解决这个问题??? :(
答案 0 :(得分:1)
只需像在不同函数中使用的任何其他变量(例如.int或string)一样全局声明您的线程:
Thread My_Thread; //goes before your functions/main method
然后使用它:
private void but_Click(object sender, EventArgs e)
{
My_Thread = new Thread(Send_File);
My_Thread.IsBackground = true;
My_Thread.Start();
}
并杀死它:
private void Send_File()
{
MyThread.Abort();
}
如果您正在谈论在线程中运行的Send_File,只需使用break
退出它,停止所有循环以完成它。
编辑: 正如Austin Salonen在他的评论中所述,这将覆盖线程参考。我的建议是使用线程列表。
public List<Thread> ThreadList=new List<Thread>(); //goes before your functions/main method (public for use in other classes)
并使用它:
private void but_Click(object sender, EventArgs e)
{
Thread My_Thread = new Thread(Send_File);
My_Thread.IsBackground = true;
My_Thread.Start();
int ThreadIndex = ThreadList.Count; //remember index
ThreadList.Add(My_Thread);
}
您只需记住列表的索引即可再次创建对该线程的引用。
要中止线程,只需使用其索引:
ThreadList[ThreadIndex].Abort();
ThreadList[ThreadIndex] = null;
或者让线程返回。
答案 1 :(得分:0)
在班级定义线程:
public class Whatever
{
Thread My_Thread;
private void but_Click(object sender, EventArgs e)
{
My_Thread = new Thread(() => Send_File());
//...
}
private void Send_File()
{
My_Thread.Abort() //though I can never ever ever encourage doing this
//...
}
}
或者只是回来。当Thread的工作方法返回时,它将被终止。
答案 2 :(得分:0)
如果你需要中止它正在做的事情,我强烈建议你不要直接使用Thread。我推荐一个任务并使用CancellationTokenSource
来传达取消请求。如果您需要与UI进行通信,例如进步,我建议BackgroundWorker
。如果必须使用Thread
,则需要通知用户中止。您可以通过使用线程定期检查以查看是否应该继续的共享布尔值来执行此操作。您应该以线程安全的方式读取/写入值。也许Interlocked.Exchange
可以为您或Thread.VolatileRead
和Thread.VolatileWrite
...
当你使用Thread.Abort时,它只是停止线程,除非线程试图捕获ThreadAbortException
。当你开始使用普通逻辑流的异常时,这有点不确定;但是,它是可行的。在Thread.Abort
块的上下文中,try/catch/finally
可能会发生死锁。 (以及任何其他受限制的区域)但是,Thread.Abort
并非完全建议:http://haacked.com/archive/2004/11/12/how-to-stop-a-thread.aspx
答案 3 :(得分:0)