Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何启动停止的线程_C#_.net_Winforms_Multithreading - Fatal编程技术网

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