为什么当单击右上角 x 关闭 form1 时,整个程序就像启用 false



整个程序冻结和灰色,就像启用假我不能点击它什么都不做,只是从视觉工作室关闭它停止调试。

在我添加后它开始一次:受保护的覆盖无效 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)

或在"计时器"选项中。

相关内容

最新更新