1

タスクマネージャーで、このアプリのコピーがいくつかあることに気付きましたが、CPUリソースは使用していません。

私は何か間違ったことをしているに違いないことを知っているので、私は集団に尋ねます...

これが滅菌コードです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace AnalyticsAggregator
{
class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        try
        {
            bool onlyInstance = false;
            Mutex mutex = new Mutex(true, "AnalyticsAggregator", out onlyInstance);
            if (!onlyInstance)
            {
                return;
            }

                            "Do stuff with the database"


            GC.KeepAlive(mutex);
        }
        catch (Exception e)
        {

                EventLog eventlog = new EventLog("Application");
                eventlog.Source = "AnalyticsAggregator";
                eventlog.WriteEntry(e.Message, EventLogEntryType.Error);
            }
        }
    }
}
}

同じ動作を示すミューテックス/シングルトンではない他のコンソールアプリがありますが、何が間違っていますか?私はある種の処分を想定しています...

ありがとう

4

3 に答える 3

2

コンソールアプリケーションは、実行が完了すると、通常はエントリポイントメソッドの最後まで実行されると終了しMainますが、基盤となるプロセスを維持できるため、管理していた可能性のある残りのリソースを削除するように注意する必要があります。

Environment.Exitを使用して明示的に終了できますApplication.Exit。後者は私の経験からフォームベースですが(メッセージポンプのクリアやウィンドウのクローズなどに関連します)。

肝心なのは、ハウスキーピングを確実に行うことです。

于 2013-03-25T16:21:50.110 に答える
1

usingの使用に関するステートメントを追加してみてくださいMutex。例:

using (Mutex mutex = new Mutex(true, "AnalyticsAggregator", out onlyInstance))
{
    if (!onlyInstance) return;
    ... database stuff ...
}

Mutexこれにより、中括弧内のコードが何らかの手段(通常の実行または例外)で終了したときに、インスタンスが自動的に破棄されます。

于 2013-03-25T16:21:06.887 に答える
0
Application.Exit();

標準的なアプローチですが、ユーザー入力でアプリを終了する場合を除いて(たとえば、アプリを終了しますか(y / n)?)、コンソールを閉じるだけで十分です。

于 2013-03-25T16:21:00.493 に答える