打开& C#中的off线程

时间:2014-07-13 10:02:57

标签: c# multithreading

这就是问题,我从C#开始,我想做这样的事情:

我有一个带有一个按钮和图片框的Windows窗体应用程序。

点击按钮会导致转动属性"运行"在真/假,由实际状态。这样就完成了。

此外,它应该导致打开将在程序运行时不断完成工作的脚本。这个"工作"将在Run()方法中描述。我希望这个方法只在Running == true时执行,一旦它变为false,方法应该结束。 所以我决定将它放入线程中,在我在Running = true和Running = false之间切换的方法中,我尝试启动线程并中止它。

为什么我要这样做?因为我希望能够通过开头提到的按钮打开和关闭程序。

这就是我提出的:

        Thread thProgram;


    public Form1()
    {
        InitializeComponent();
        thProgram = new Thread(new ThreadStart(this.Run));
    }

    private bool Running = false;


    public void Run()
    {
        int i = 0;
        while(this.Running)
        {
            i++;
        }
        MessageBox.Show("Terminated");
    }

     // handling bot activation button (changing color of a pictureBox1), switching this.Running property
    private void button1_Click(object sender, EventArgs e)
    {
        if(this.Running)
        {
            thProgram.Abort();
            pictureBox1.BackColor = Color.Red;
            this.Running = false;
        }
        else
        {
            thProgram.Start();
            pictureBox1.BackColor = Color.Lime;
            this.Running = true;
        }
    }

我可以完全按下按钮两次,看起来一切都很好......但是当我第三次点击它时,会弹出错误:

(它突出显示第34行" thProgram.Start();"

An unhandled exception of type 'System.Threading.ThreadStateException' occurred in mscorlib.dll

Additional information: Thread is running or terminated; it cannot restart.

提前感谢您提供给我的任何帮助。

2 个答案:

答案 0 :(得分:5)

例外是自我解释

第一次按下按钮时,线程开始并进入主循环。 第二个按钮按下中止线程(这总是一个坏主意。你使用的那个标志就足够了)并且线程终止。

按下第三个按钮?来自Thread.Start()的{​​{1}}:

Once the thread terminates, it cannot be restarted with another call to Start.

答案 1 :(得分:2)

要冻结线程而不终止它,我建议使用AutoResetEvent

public Form1()
{
    InitializeComponent();
    thProgram = new Thread(new ThreadStart(this.Run));
}

private bool Running = false;
private AutoResetEvent ThreadHandle = new AutoResetEvent(false);


public void Run()
{
    int i = 0;
    while(true)
    {
        ThreadHandle.WaitOne();
        i++;
    }
    MessageBox.Show("Terminated");
}

 // handling bot activation button (changing color of a pictureBox1), switching this.Running property
private void button1_Click(object sender, EventArgs e)
{
    if(this.Running)
    {
        thProgram.Abort();
        pictureBox1.BackColor = Color.Red;
        this.ThreadHandle.Reset();
        this.Running = false;
    }
    else
    {
        thProgram.Start();
        pictureBox1.BackColor = Color.Lime;
        this.ThreadHandle.Set();
        this.Running = true;
    }
}