2011-07-05 92 views
8

我创建一个新线程并从主线程启动它。如何启动停止线程

m_MyThread = new Thread(HandleMyThread); 
m_MyThread.IsBackground = true; 
m_MyThread.Start(); 

private void HandleMyThread() 
{ 
    while (true) 
    { 
     Thread.Sleep(5000); 
     return; 
    } 
} 

5秒钟后,该线程将结束并且其ThreadState被停止。我想,当用户点击按钮,重新启动它,但我得到一个ThreadStateException (Thread is running or terminated; it cannot restart)

private void button1_Click(object sender, EventArgs e) 
{ 
    m_MyThread.Start(); // ->raise exception 
} 

请帮助我如何重新启动停止线程。谢谢。

+1

有关阻止线程查看我的问题的其他信息: [正确的方法来停止线程作业](http://stackoverflow.com/questions/5146186/proper-way-to-stop-a-threaded- job-forced) – Gerard

回答

2

如果您想要每次重新使用线程而不需要新建线程,则可以考虑执行线程池。

+0

但有两种方法,最好的方法是什么,因为我想重用该线程。请以两种方式告诉我优点和缺点。 –

1

只需在最初创建线程时制作一个新线程。你也可能想把它变成一种避免重复自己的方法。

3

使用ManualResetEvent,而不是Thread.Sleep,请等待超时事件。

然后,任何其他线程可以激活该事件,并立即恢复睡眠线程。

线程退出后,它不能再运行。所以不要让它退出。相反,把它放回到睡觉等待事件。

+0

我在应用程序中遇到问题。当我运行我的应用程序时,我需要创建一个线程,休眠到接下来的上午8点以提出事件。请给我解决的方法。此刻,我创建一个线程并计算从现在到上午8点的总毫秒数,以便在此时间段内睡眠。在完成睡眠后,它会发起一个事件。你对我的方式有什么理想吗?谢谢。 –

8

我知道这个问题有点老,但我想我会发布一个回应,以防其他人来到这里。

对于本示例代码,如果它被改成这个样子:

Thread m_MyThread; 
private void HandleMyThread() 
{ 
    while (true) 
    { 
     Thread.Sleep(5000); 
     return; 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (!m_MyThread.IsAlive) 
    { 
     m_MyThread = new Thread(HandleMyThread); 
     m_MyThread.IsBackground = true; 
     m_MyThread.Start(); 
    } 
} 

这将创建线程的新实例并启动它。 ThreadStateException错误是因为,简而言之,您无法重新启动处于停止状态的线程。 m_MyThread.Start()仅对Unstarted状态的线程有效。在这种情况下需要做的是创建一个新的线程实例,并在新实例上调用Start()

0

要重新启动一个线程,试试这个:

private void button1_Click(object sender, EventArgs e) 
{ 
    // Just create a new constructor for the stopped Thread 
    m_MyThread = null; 
    m_MyThread = new Thread(HandleMyThread); 
    m_MyThread.IsBackground = true; 
    // Then restart the stopped Thread 
    m_MyThread.Start(); 
} 

如果线程先前停止工作的。

+0

这是Daniel Winks(http://stackoverflow.com/a/8568206/2029849)给出的相同解决方案, – abto