2

共有ストレージサーバー上の多くのユーザーが使用する小さなC#コンソールアプリを作成しました。実行時間は常に3秒未満である必要があり、ユーザーが実際に使用しようとしている別のGUIアプリを支援するために、バックグラウンドで自動的に実行されます。このため、エラーがスローされるかどうかに関係なく、プログラムが常に完全に終了することを確認したいと思います。

Application_Startupには、次の基本構造があります。

try
{
    // Calls real code here
}
catch
{
    // Log any errors (and the logging itself has a try with empty catch around it
    // so that there's no way it can causes problems)
}
finally
{
    Application.Shutdown();
}

この構造では、アプリがゾンビプロセスになることは不可能だと思いました。ただし、このアプリの新しいバージョンをプッシュしようとすると、「ファイルが使用中」であるため、実行可能ファイルを削除して置き換えることができないことが繰り返しわかります。つまり、実行可能ファイルは、数秒で常にシャットダウンします。

それで、私のアプリが、私が持っているコード構造を持つ人々のコンピューター上でぶら下がっているプロセスになっているように見えるのはどうしてですか?私は何が欠けていますか?

編集:「アプリケーション」を追加しました。明確にするためにShutDown()を解決します。

4

2 に答える 2

2

ここには2つのオプションがあります。

  1. コンソールアプリケーションは実際には3秒で終了しませんが、かなり時間がかかります。あなたはそれをデバッグして、何がそんなに長くかかるかを見る必要があります。
  2. コンソールアプリケーションの終了には3秒かかりますが、GUIによって毎分実行され、40人を超えるユーザーがいるため、未使用の実行可能ファイルが見つかる可能性は低くなります。

これが最初のスレッドであり、デバッグしたくない場合は、いつでも2番目のスレッドを開始し、3秒間待ってから、プロセス全体を強制終了できます。

于 2011-11-16T22:12:34.117 に答える
1

たぶん、tryブロック内のコードは、少なくとも1つのクライアントに対してまだ実行されており、実際には3秒程度に制限されていません。このようなケースを防ぐには、マルチスレッドアプリケーションが必要になります。1つは処理用のスレッドで、もう1つはバックグラウンドでタイムアウト後に作業中のスレッドを強制終了します。その前に、そのようなインフラストラクチャが本当に必要かどうかを自問する必要があります。

もう1つ頭に浮かぶのは、ユーザーの1人がその時点でアプリケーションを実行していたことです。確率は、ユーザーの数によって異なります。

おそらく、クライアント要求ごとに1つの実行中のアプリケーションをインスタンス化するのではなく、常に実行中のマルチスレッドサービスとしてサポートアプリを設計する方がはるかに優れたアイデアです。

于 2011-11-16T22:19:55.250 に答える