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

时间:2009-06-28 13:04:09

标签: c# multithreading

我正在寻找一种方法来重启已被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";
  }
}

有什么想法吗?

7 个答案:

答案 0 :(得分:33)

一旦您中止了线程,就无法再次启动它。

但是您的实际问题是您正在中止您的主题。你应该never use Thread.Abort()

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

<强> [编辑]

如上面链接中Ian Griffiths所述,中止线程的最简单方法是:

  

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

要使其正常工作,您需要做的唯一事情是重新排列背景方法,使其在循环中运行,以便您可以定期检查您的标记是否已设置通过不同的线程。

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

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

答案 1 :(得分:17)

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

编辑:请注意,使用thread.Abort()查杀线程可能非常危险。你应该尝试完成干净的多线程,就像他在帖子中描述的Groo。

答案 2 :(得分:7)

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

如果你真的需要中断线程功能并恢复,你应该设置一个条件,然后在处理过程中定期检查它。

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:-3)

我真的不明白为什么人们提供信息,如果他们不知道这是正确的.. 一个真正的程序员如何暂停或停止处理一个线程然后释放它,从而使代码易受攻击...... @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属性来检查线程是否正在运行(只是为了避免同一线程的多个实例.....