【发布时间】:2015-12-04 17:02:29
【问题描述】:
据我所知,由于 UI 和 Worker 线程之间的交互,无法将 winform 加载到 backgroundworker 的 DoWork 中, 但是我找到了一种方法来做到这一点,我定义了另一个显示表单的线程,然后将该线程启动到后台工作人员的 DoWork 中。 它起作用了,我现在可以控制那个后台工作人员的进程......但我不确定它是否是一种安全方法。我的简化计划是:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
void UI1()
{
using (Form2 f = new Form2())
f.ShowDialog();
}
Thread ui1;
private void Form1_Load(object sender, EventArgs e)
{
ui1 = new Thread(UI1);
Control.CheckForIllegalCrossThreadCalls = false;
temp.backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker1_DoWork);
}
private void button1_Click(object sender, EventArgs e)
{
temp.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100000;
progressBar1.Value = 0;
for (int i = 0; i < 100000; i++)
{
progressBar1.Value++;
if (i == 5000)
{
ui1.Start();
temp.backgroundWorker1.CancelAsync();
temp.ew.Reset();
}
if (temp.backgroundWorker1.CancellationPending)
temp.ew.WaitOne();
}
}
}
在 Form2 中:
private void button1_Click(object sender, EventArgs e)
{
temp.ew.Set();
this.Close();
}
【问题讨论】:
-
这是灾难的完美秘诀。你为什么不直接使用 BackgroundWorker 来更新“正常”的 UI 线程(因为这已经为你完成了)?
-
什么是“正常”的 UI 线程?我现在无法访问 Visual Studio,但整个计划是:后台工作人员的进程停止,直到另一个表单打开并且用户插入信息并按下按钮,新表单关闭并且后台工作人员继续工作......所以我需要另一个在进程停止时加载的表单
-
你的计划倒退了。如果在后台处理过程中需要用户输入,则需要将进程拆分为可以相互独立执行的块。
标签: c# multithreading winforms thread-safety backgroundworker