C# 如何启动停止的线程
我创建一个新线程并从主线程开始C# 如何启动停止的线程,c#,.net,winforms,multithreading,C#,.net,Winforms,Multithreading,我创建一个新线程并从主线程开始 m_MyThread = new Thread(HandleMyThread); m_MyThread.IsBackground = true; m_MyThread.Start(); private void HandleMyThread() { while (true) { Thread.Sleep(5000); return; } } 5秒后,此线程将完成,其ThreadState将停止。当用户单击
m_MyThread = new Thread(HandleMyThread);
m_MyThread.IsBackground = true;
m_MyThread.Start();
private void HandleMyThread()
{
while (true)
{
Thread.Sleep(5000);
return;
}
}
5秒后,此线程将完成,其ThreadState将停止。当用户单击按钮时,我想再次启动它,但我得到一个线程状态异常(线程正在运行或终止;它无法重新启动)
:
请帮助我如何重新启动停止的线程。谢谢。只需像最初创建线程时那样创建一个新线程即可。您可能还想把它拉到一个避免重复自己的方法。 < P>如果您希望每次使用线程而不使用新的线程,则可以考虑线程池的实现。p> 使用
手动重置事件
,而不是线程。睡眠
,等待事件超时
然后,任何其他线程都可以激活该事件,并立即恢复休眠线程
线程一旦退出,就不能再运行。所以不要让它退出。我知道这个问题有点老了,但我想我会在其他人来的时候发布一个回复 对于此示例代码,如果将其更改为如下所示:
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()
仅对处于未启动状态的线程有效。在这种情况下需要做的是创建一个新的线程实例,并在新实例上调用Start()
。要重新启动线程,请尝试以下操作:
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();
}
如果线程先前已停止,则此操作有效。但在两种情况下,什么是最好的方法,因为我希望重用线程。请从两个方面告诉我优缺点。我在申请中遇到了一个问题。当我运行我的应用程序时,我需要创建一个休眠到下一个上午8点的线程来引发一个事件。请告诉我解决问题的方法。现在,我创建了一个线程,并计算从现在到早上8点的总毫秒数,以便它在这段时间内睡眠。睡眠结束后,它将引发一个事件。你对我的方式有什么想法吗?谢谢。有关停止线程的其他信息,请查看我的问题:@Leovo查看:这不是答案,但可能会有帮助。这与Daniel Winks()已经给出的解决方案相同。我知道答案有点旧,但它也解决了我的问题
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();
}