整个程序冻结和灰色,就像启用假我不能点击它什么都不做,只是从视觉工作室关闭它停止调试。
在我添加后它开始一次:受保护的覆盖无效 OnFormClosed
bool mCompleted = false;
bool mClosePending = false;
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (!mCompleted)
{
backgroundWorker1.CancelAsync();
this.Enabled = false;
e.Cancel = true;
mClosePending = true;
return;
}
base.OnFormClosing(e);
}
我添加了此覆盖,因为我想确保我正在使用的后台工作者在单击右上角 x 时关闭 form1 之前停止。所以它在后台工作线程运行时工作,但是当后台工作线程不运行时,我只需运行程序并单击 x,然后整个程序就像启用 false 一样,我所能做的就是通过停止调试来关闭它。
在后台工作者完成事件中,我做了:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
}
if (e.Error != null)
{
}
else
{
mCompleted = true;
if (mClosePending) this.Close();
}
}
但是当后台工作者没有运行时,我只是单击 x,就会出现问题。
如果在 OnClosing 覆盖中标志 mCompleted 为 false,则输入第一个 if 条件,而不检查后台工作线程是否正在运行。这将禁用主窗体(this.Enabled = false;
)并取消关闭(e.Cancel = true;
),即使后台工作线程未运行。此时,没有关闭窗体的代码,因为显然不会在未运行的后台工作线程上引发 WorkerFinished 事件。
您需要检查 IsBusy 属性。
if (!mCompleted && backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
this.Enabled = false;
e.Cancel = true;
mClosePending = true;
return;
}
base.OnFormClosing(e);
通过将"取消"设置为 true,您可以有效地中止窗体关闭并将其禁用:
this.Enabled = false;
e.Cancel = true;
您应该添加一个检查以确保后台工作线程正在运行,以便它最终关闭窗体。
您可能还希望添加超时,以防工作人员在某些情况下卡住,具体取决于工作人员的工作。
理想情况下,您将使用 wait 事件来等待工作人员完成,然后关闭窗体,而不是依赖工作人员关闭它,以便您可以将关闭逻辑保存在一个位置。
看看这个答案:如何等待 BackgroundWorker 完成,然后退出控制台应用程序
我认为与标志一起使用是最简单的。该标志将在以下位置更新:
ProgressChanged(object sender, ProgressChangedEventArgs e)
或在"计时器"选项中。