从调用函数c#中删除一个线程

时间:2012-08-14 21:42:51

标签: c# multithreading kill

我有按钮调用此代码

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()

请帮我解决这个问题??? :(

4 个答案:

答案 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.VolatileReadThread.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)

Thread.Abort()是您正在寻找的。

参考文献&amp;有用的页面: