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

4

3 回答 3

2

使互斥锁成为全局的

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

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

于 2012-05-18T10:03:11.860 回答
0

我认为您在那里遗漏了很多可能的异常,这个示例更适合处理您可能遇到的各种错误, MSDN 上的 Mutex.OpenExisting Method example

于 2012-05-15T08:36:53.513 回答
0

这里的问题是你在调用OpenExisting和'new 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;
    }
}

这是我用于此答案的参考:C# 中的线程:互斥锁

于 2012-05-15T08:41:49.483 回答