【发布时间】:2015-12-03 17:13:35
【问题描述】:
这是解决方案的简化计划: 由于某些原因,我需要通过由另一个后台工作程序运行的后台工作程序运行 Windows 窗体,当新的 Windows 窗体加载时,旧的后台工作程序必须暂停。我这样写代码:
创建一个名为 temp 的类
public class temp
{
static public BackgroundWorker backgroundWorker1 = new BackgroundWorker() { WorkerSupportsCancellation = true };
static public EventWaitHandle ew = new EventWaitHandle(false, EventResetMode.ManualReset);
static public BackgroundWorker back = new BackgroundWorker() { WorkerSupportsCancellation = true };
}
form1 的代码是:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
temp.backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
temp.back.DoWork += new DoWorkEventHandler(back_DoWork);
}
void back_DoWork(object sender, DoWorkEventArgs e)
{
Form2 f = new Form2();
f.Show();
}
private void button1_Click(object sender, EventArgs e)
{
temp.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
temp.back.RunWorkerAsync();
if (temp.backgroundWorker1.CancellationPending)
temp.ew.WaitOne();
}
}
}
form2 的代码在这里:
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
temp.backgroundWorker1.CancelAsync();
temp.ew.Reset();
}
}
}
通过单击 form1 中的 button1,temp.backgroundworker1 运行,然后在 temp.backgroundworker1 的 DoWork 中,temp.back 运行,然后 FORM2 加载,但 FORM2 挂起并变得无用,您不能再使用它了。 我哪里错了? 我要执行的整个计划是: 我们有一个处理 DataGridView 每一行的 For 循环。 每次在某一点,另一个窗体打开 它会停止循环,直到用户插入信息然后单击“确定”按钮,windowsform 关闭并且循环继续工作。我不知道该怎么办.......
即使我没有像下面的代码那样取消 form2load 中 temp.backgroundworker 的工作,Form2 也是无用的
private void Form2_Load(object sender, EventArgs e)
{
}
【问题讨论】: