4

インターネットからアップデートをダウンロードしてインストールするアプリケーションアップデート機能があり、マルチインスタンスアプリケーションに取り組んでいます。
ここで問題となるのは、開いているインスタンスが複数ある場合、すべてがエラーにつながる更新をインストールしようとすることです。
チュートリアルを読んだ後に学んだ簡単なコードスニペット。

    static bool IsSingleInstance()
    {
        try
        {
            // Try to open existing mutex.
            Mutex.OpenExisting("myMutex");

        }
        catch
        {
            // If exception occurred, there is no such mutex.
            Window1.mutex = new Mutex(true, "myMutex");

            // Only one instance.
            return true;
        }
        // More than one instance.
        return false;
    }

私はC#が初めてです。したがって、Mutexを使用して、1つのインスタンスのみがアップデートをダウンロードしてインストールできるようにする方法を教えてもらえますか。
このトピックについて知っている場合は、適切なチュートリアルのリンクを教えてください。

4

3 に答える 3

2

ミューテックスをグローバルにする

Window1.mutex = new Mutex(true, "Global\\myMutex");

Mutex.OpenExisting("Global\\myMutex");

于 2012-05-18T10:03:11.860 に答える
0

ここでの問題は、と'new Mutex`の呼び出しの間に時間のギャップがあることですOpenExisting。したがって、必要なものを実装するiクラスは次のようになります。

class YourApp : IDisposable 
{
    private readonly Mutex _mutex;
    private bool _isFirstInstance;

    public YourApp()
    {
        _mutex = new Mutex(false, "myMutex");
    }

    ~YourApp()
    {
        this.Dispose(false);
        GC.SurpressFinalize(this);
    }

    public bool IsFirstInstance
    {
        if(_isFirstInstance)
            return true;

        _isFirstInstance = _mutex.WaitOne (TimeSpan.FromSeconds(1d), false);
        return _isFirstInstance;
    }

    private bool IsDisposed { get; set; }

    public void Dispose()
    {
        this.Dispose(true);
    }

    private void Dispose(bool disposing)
    {
        if(this.IsDisposed)
           return;

        if(disposing)
           _mutex.Dispose();

        this.IsDisposed = true;
    }
}

これが私がこの答えに使用するリファレンスです:C#でのスレッド化:Mutex

于 2012-05-15T08:41:49.483 に答える
0

考えられる例外がかなり不足していると思います。この例は、発生する可能性のあるさまざまなエラーを処理するのにはるかに適しています 。MSDNのMutex.OpenExistingメソッドの例

于 2012-05-15T08:36:53.513 に答える