0

ここに私が読んだ記事がありますhttp://kristofverbiest.blogspot.com/2008/11/creating-single-instance-application.html、記事の手順に従ってください。次のコードがあります。動作せず、次のこともできません:

static class Program
{
    static Mutex mutex;
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        bool alreadyRun;
        mutex = new Mutex(false, Guid.NewGuid().ToString().Replace("-", ""), out alreadyRun);
        if (!alreadyRun) return;                            
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());            
    }
}

この記事では、渡される Mutex 名はランダムにできると述べています。私はそれがどのように機能するのだろうか?そのコンストラクターは成功しalreadyRun、ランダムな GUID 文字列が一意である場合はいつでも true になります (つまり、以前に作成された名前の Mutex がなかったということです)。つまり、alreadyRun偽になる可能性はほとんどありません。実際、上記のコードを何度も試してみたところ、アプリケーションの多くのインスタンスを好きなように実行できました。

ミューテックス名に「unique」などの固定文字列を試した後、それは単に機能します。ただし、別のアプリケーションが同じ名前で別のミューテックスを作成している場合、これは機能しません。そして、私は今、この解決策になりました:

  • ランダムな文字列を使用することはできません。固定文字列を使用する必要があり、この文字列は長く複雑にする必要があります。これはパスワードや ID のようなもので、他のアプリケーションが同じ名前を使用する可能性がほとんどないようにします。これは私が確信している例です。他の(マシンでさえ)考えられる可能性はほとんどありません。ilove.netilovejava1234forever56789thismyid_itisevenlongerlongerlonger_howlongcanitbe_maybe8000characters?_canitbeso?

記事について説明し (プロのブロガーのようです)、Mutex を使用した他の解決策を教えてください (私は の使用にうんざりしていてGetProcessesByName、今のところうまくいきません)。ありがとう!

4

2 に答える 2