如何从另一个表单按钮启动和暂停后台运行线程?

时间:2013-06-14 05:33:16

标签: c# windows winforms

我有两种形式。 form1 调用在加载期间启动后台运行线程。   一旦明星跑了。 表单2 会弹出两个按钮(开始和停止)。   当我按下停止按钮时,线程应该暂停,当我按下启动时,暂停线程应该从停止的位置开始执行。

我尝试使用此代码。

   myResetEvent.WaitOne();//  to pause  the thread

   myResetEvent.Set();   // to resume the thread.

因为这些事件是在form1中定义的,但我希望它能从form2开始工作。

2 个答案:

答案 0 :(得分:0)

最后我得到了答案,它适用于我的案例,发布它,可能会帮助其他人..

表格1代码..

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace thread_example
{
public partial class Form1 : Form
{
    private int i = 0;
    public Thread Run_thread = null, run1 = null; // thread definition
    public static AutoResetEvent myResetEvent = new AutoResetEvent(false);//intially set to false..
    public Form1()
    {
        InitializeComponent();
        run1 = new Thread(new ThreadStart(run_tab));
        run1.IsBackground = true;
        run1.Start();
    }

    private void run_tab()
    {
        //do something.        

    }

    private void button1_Click(object sender, EventArgs e)
    {
        form2 f2 = new form2();
        f2.Show();
    }
}
}




// Form 2 code...

  namespace thread_example
  {
    public partial class form2 : Form
  {
    public form2()
    {
        InitializeComponent();
    }

    private void btn_stop_Click(object sender, EventArgs e)
    {
        Form1.myResetEvent.WaitOne();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form1.myResetEvent.Set();
    }
 }
}

答案 1 :(得分:-1)

您可以将Event实例作为表单参数传递给第二个表单。

class Form1
{
  ManualEvent myResetEvent;

  void ShowForm2()
  {
    var form2 = new Form2(myResetEvent);
    form.ShowDialog();
  }
}

class Form2
{
  ManualEvent myResetEvent;

  Form2(ManualEvent event)
  {
    myResetEvent = event;
  }

  void StopButtonClick()
  {
    myResetEvent.Reset();
  }

  void ContinueButtonClick()
  {
    myResetEvent.Set();
  }
}