gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:59:40 26 4
gpt4 key购买 nike

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

有什么想法吗?

最佳答案

一旦你中止了你的线程,你就不能再启动它了。

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

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

[编辑]

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

The approach I always recommend is dead simple. Have a volatile bool field that is visible both to your worker thread and your UI thread. If the user clicks cancel, set this flag. Meanwhile, on your worker thread, test the flag from time to time. If you see it get set, stop what you're doing.

要使其正常工作,您唯一需要做的就是重新安排您的后台方法,使其循环运行 - 这样您就可以定期检查您的标志是否已设置通过不同的线程。

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

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

关于c# - 在 .NET 中重新启动线程(使用 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com