在.NET中重新启动线程(使用C#)

我正在寻找一种方法来重新启动已被Abort()停止的线程。

public partial class MyProgram : Form { private Thread MyThread = new Thread(MyFunction); private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button(); public MyProgram() { MyThread.Start(); startStopBtn += new EventHandler(doStop); startStopBtn.Text = "Stop"; } private static void MyFunction() { // do something } private void doStop(object sender, EventArgs e) { MyThread.Abort(); startStopBtn -= new EventHandler(doStop); startStopBtn += new EventHandler(doStart); startStopBtn.Text = "Start"; } private void doStart(object sender, EventArgs e) { MyThread.Start(); // << Error returned when clicking the button for 2nd time startStopBtn -= new EventHandler(doStart); startStopBtn += new EventHandler(doStop); startStopBtn.Text = "Stop"; } } 

任何的想法?

只需在doStart()中调用MyThread.Start()之前添加MyThread = new Thread(MyFunction)。 不要在你的方法之外创建线程,那里有空间用于声明。

编辑:请注意,使用thread.Abort()杀死一个线程可能非常危险。 您应该尝试完成干净的multithreading,就像Groo在他的post中描述的那样。

一旦中止了线程,就无法重新启动它。

但你的实际问题是你正在中止你的线程。 你永远不应该使用Thread.Abort() 。

如果您的线程应暂停并继续多次,则应考虑使用其他机制(例如AutoResetEvent )。

[编辑]

如上面的链接中Ian Griffiths所提到的,中止线程的最简单的解决方案是:

我总是推荐的方法很简单。 拥有一个对工作线程和UI线程都可见的volatile bool字段。 如果用户单击“取消”,请设置此标志。 同时,在您的工作线程上,不时测试该标志。 如果你看到它被设置,停止你正在做的事情。

要使其正常工作,您需要做的唯一事情是重新排列背景方法,使其在循环中运行 – 这样您就可以定期检查您的标志是否已由其他线程设置。

如果你需要为同一个工作线程提供暂停和恢复function,而不是简单的volatile bool标志方法,你可以采用稍微复杂的方法,一个同步结构,如AutoResetEvent 。 这些类还提供了一种方法,使工作线程在来自非工作线程的信号之间保持指定(或无限期)的时间。

该线程包含一个具有Start,Pause,Resume和Stop方法的具体示例。 注意Brannon的例子永远不会中止线程。 它只触发一个事件,然后等待线程正常完成。

简单的答案是,你做不到。 线程中止后,您无法重新启动它。 只需创建一个方法或类似的东西,就可以根据需要返回一个Thread对象。 当你需要一个新的线程时,只需从该方法中获取它。

不,没有,但你为什么要这样做? 只需启动一个新线程,使用相同的ThreadStart和相同的参数(如果有的话)。

如果确实需要中断线程function并恢复,则应设置条件,然后在处理过程中定期检查。

这将允许您停止处理一段时间然后恢复。

我使用事件和等待调用来完成类似的任务。

最简单的方法是不中止线程。

我真的不明白为什么人们提供信息,如果他们不知道这是正确的。一个真正的程序员如何暂停或停止处理一个线程,然后释放它,从而使代码易受攻击…… @Brad–对不起..但你的想法并不好.. @Rhythmic – 你需要努力接近事情……

如果人们以他想说的方式得到他,那么BFree是对的……你只需要重新宣布……

以下是示例:

 Public Shared Sub ResetAbort() Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) YourThreadName.Start() Thread.Sleep(2000) YourThreadName.Abort() End Sub 

现在,您可以在任何想要启动线程的地方使用此Sub。 它会自动中止线程。

如果你想在Button1_click()事件上启动线程并在Button2_Click()事件上停止它,请使用:

在Button1_click()事件中

  Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) YourThreadName.Start() 

在Button2_click()事件中

  YourThreadName.Start() 

这样你就可以在任何你想要的地方中止线程并再次初始化它。 您还可以使用YourThreadName.ThreadState.Running属性来检查线程是否正在运行(只是为了避免同一个线程的多个实例……