Mutex实现,用于避免同时下载应用程序更新的多个实例

时间:2012-05-15 08:26:39

标签: c# wpf

我正在进行多实例应用程序有应用程序更新功能,从互联网下载更新并安装它。
现在问题是如果有多个实例打开然后所有尝试安装更新导致错误。
简单的代码片段我在阅读完教程后学到了。

    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来确保只有一个实例可以下载并安装更新 如果您对此主题有所了解,请告知相关教程的链接。

3 个答案:

答案 0 :(得分:2)

通过

使互斥锁全局化

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

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

答案 1 :(得分:0)

我认为你错过了很多可能的例外,这个例子更适合处理你可能遇到的各种错误, Mutex.OpenExisting Method example on MSDN

答案 2 :(得分:0)

这里的问题是你在OpenExisting和'新Mutex`的通话之间有时间差 所以,我实现你需要的东西可能看起来像这样。

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;
    }
}

这是我用于此答案的参考:Threading in C#: Mutex