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

时间:2016-07-10 07:13:56

标签: c# .net winforms

整个程序冻结,灰色就像启用了false我无法点击它只会从视觉工作室Stop Debugging中关闭它。

我添加后启动了一次:protected override void OnFormClosing

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);
}

我添加了这个覆盖,因为我想确保我使用的后台工作程序在关闭form1之前停止,当我点击右上方的x时。因此,当backgroundworker正在运行时它正在工作但是当后台工作程序没有运行时我只运行程序并单击x然后整个程序就像启用了false而我所能做的就是通过停止调试来关闭它。

在backgroundworker完成的事件中,我做了:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {

    }
    if (e.Error != null)
    {

    }
    else
    {
        mCompleted = true;
        if (mClosePending) this.Close();
    }
}

但问题发生在backgroundworker没有运行时我只点击了x。

3 个答案:

答案 0 :(得分:1)

通过将取消设置为true,您实际上会中止表单关闭并将其禁用:

this.Enabled = false;
e.Cancel = true;

您应该添加一项检查,以确保 BackgroundWorker 正在运行,以便最终关闭该表单。

您可能还希望添加超时,以防工作人员在某些情况下陷入困境,具体取决于您的工作人员的工作。

理想情况下,您将使用等待事件等待工作人员完成然后关闭表单,而不是依靠工作人员关闭它,以便您可以将结束逻辑保留在一个位置。

看一下这个答案:How to wait for BackgroundWorker to finish and then exit console application

答案 1 :(得分:1)

如果OnClosing覆盖中的标志mCompleted为false,则输入第一个if条件,而不检查后台工作程序是否正在运行。即使后台工作程序未运行,这也会禁用主窗体(this.Enabled = false;)并取消关闭(e.Cancel = true;)。此时没有关闭表单的代码,因为显然未在未运行的BackgroundWorker上引发WorkerCompleted事件。

您需要检查IsBusy属性。

if (!mCompleted && backgroundWorker1.IsBusy)
{
    backgroundWorker1.CancelAsync();
    this.Enabled = false;
    e.Cancel = true;
    mClosePending = true;
    return;
 }
 base.OnFormClosing(e);

答案 2 :(得分:0)

我认为使用旗帜是最简单的。 该标志将更新:

ProgressChanged(object sender, ProgressChangedEventArgs e)

或在计时器选项中。