1

私は 1 つの BackgroundWorker を作成しており、その DoWork 関数内に次のコードがあります。

        foreach (string newFilepath in newFilesPath)
        {
                        if (!File.Exists(encryptedFilePath))
                        {
                            encryptedFiles.Add(encryptedFilePath);
                            Helper.SendErrorMail(null, "Could not find encrypted file.", encryptedFilePath);
                            Application.Exit();
                        }
                        else
                        {
                            Helper.Count_DataFeeds++;
                            File.Delete(newFilepath);
                        }
        }

このコードによると、アプリケーションが存在するため、メールは 1 つしか表示されませんが、8 つのメールが表示されます (反復しているファイルごとに)。アプリケーションが終了しないのはなぜですか? アプリケーションを一度に終了させたい。

コンソールアプリケーションです。

4

3 に答える 3

2

コンソールアプリケーションです

つまり、 Application.Exit() は効果がなく、開いている Winform フォームを閉じるだけです。メインフォームを閉じるとメッセージループが終了するという副作用があります。これにより、Application.Run() 呼び出しが完了し、Main() メソッドが完了してアプリが終了します。

コンソール モード アプリには、ウィンドウもメッセージ ループもありません。代わりに Environment.Exit() を使用する必要があります。

于 2012-11-07T21:52:34.353 に答える
1

メッセージ ポンプの基本的な理解から始める必要があります。非常に低いレベルでの UI スレッドとは、while ループです。

while(!shouldQuitapplication)
{
   Item nextItem = queue.GetNextItem();
   nextItem.Run();
}

呼び出すたびControl.Invokeに新しいアイテムをキューに追加し、フックがイベント (マウスの移動、ボタンのクリックなど) を発生させるたびに、新しいアイテムをキューに追加します。すべての項目は、受信した順序で同期的に処理されます。

Application.Exit基本的に、キュー内の既存のアイテムがすべて終了したら、プロセス全体を終了する方法です。

BackgroundWorker を実行しているため、UI スレッドが実行していることに加えて、「その他のこと」を実行しています。UI スレッドに終了を指示すると、キュー内の残りのタスクを完了するのに時間がかかります。(これが、バックグラウンド タスクがさらにいくつかの操作を実行しているのを見る理由です。その数は潜在的に異なる場合があります。)

バックグラウンド以外のスレッドがなくなるとすぐに、プロセス全体が破棄されることに注意してください。UI スレッドは非バックグラウンド スレッドであり、使用している BackgroundWorker はバックグラウンド スレッドを使用しています。UI スレッドが終了すると、バックグラウンド ワーカーが停止します。非 UI スレッドを手動で作成していた場合、プロセスが「アップ」したままになる可能性があり、UI スレッドが停止した後でも停止しません。(しかし、それは一歩後退することになるので、明らかにこの状況では役に立ちません。)

別の回答で述べたように、解決策は、 、 を呼び出すApplication.Exitか、無効なアイテムで停止するようにループを別の方法で構造化することにより、を呼び出した後にバックグラウンド タスクが何もしないようにすることです。breakreturn

于 2012-11-07T21:01:05.907 に答える
0

Environment.Exitが必要だったものです。

于 2012-11-07T20:57:21.300 に答える