2016-07-10 3 views
-2

プログラム全体がフリーズし、灰色のように有効になっています。私はそれをクリックできません。ビジュアルスタジオからクローズするだけで何もしません。デバッグを停止します。なぜフォーム全体を閉じるために右上のxをクリックすると、プログラム全体が偽を有効にするようになりますか?

私が追加した後、それは一度起動:

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

をOnFormClosing保護されたオーバーライドボイドを私は右上のをクリックしたときに必ず私が使用しているBackgroundWorkerのは、Form1を閉じる前に停止した作りたかったので、私はこのオーバーライドを追加しましたバツ。 backgroundworkerが動作している間に働いているのですが、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をクリックしたときに問題が起こります。

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

あなたはBackgroundWorkerのは、それが最終的に閉じます実行されていることを確認するためのチェックを追加する必要があります:あなたが効果的にフォームを閉じるのを中止し、無効にそれを残しているtrueにをキャンセルを設定することにより

+1

さて、フォームを無効にして閉じる操作をキャンセルします。ここで何が起こると思いますか? – Steve

+1

私は問題があると思います:this.Enabled = false; – klaymen

+3

私は[サンプルコード](http://stackoverflow.com/a/1732361/17034)をこのような間違いに対してもう少し弾力的に変更しました。 Googleの「帰属は必須」となり、最初のヒットとなります。 –

答えて

1

あなたの旗mCompletedはあなたのバックグラウンドワーカーが作動しているかどうかチェックせず状態であれば最初に入るOnClosingオーバーライドで偽の場合。これにより、バックグラウンドワーカーが実行されていなくても、メインフォーム(this.Enabled = false;)が無効になり、閉じる(e.Cancel = true;)がキャンセルされます。明らかにWorkerCompletedイベントが実行中のBackgroundWorkerで生成されないため、この時点でフォームを閉じるコードはありません。

IsBusyプロパティを確認する必要があります。

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

形。

作業者の仕事によっては、労働者が詰まる場合があるため、タイムアウトを追加することもできます。

waitイベントを使用して、ワーカーが終了するのを待ってから、フォームを閉じて閉じて、閉じロジックを1か所に保持できるようにするのが理想です。

この回答を見てください:How to wait for BackgroundWorker to finish and then exit console application

0

フラグを使用するのが最も簡単だと思います。

ProgressChanged(object sender, ProgressChangedEventArgs e) 

や、タイマーのオプションで: フラグがに更新します。

関連する問題