代码之家  ›  专栏  ›  技术社区  ›  Joel Barsotti

在WPF中使用全局互斥体的正确模式是什么?

  •  2
  • Joel Barsotti  · 技术社区  · 16 年前

    所以我找到了这个信息 What is a good pattern for using a Global Mutex in C#?

    但它是基于标准应用程序的主要入口点。 如何修改此项以适用于启动应用程序的WPF事件模型?

    4 回复  |  直到 15 年前
        1
  •  0
  •   Randolpho    16 年前

    当我第一次回答这个问题时,我读写了wpf,但我想“wcf”。愚蠢的我。这是我的新答案:

    如果它必须是真正的全局的,那么将互斥设置放在任何使用共享资源之前的早期事件中。 Application.Startup 可能是你最好的选择。

        2
  •  0
  •   BladeWise    16 年前

    你是要这个创造一个 单实例WPF应用程序 ?如果是的话,我鼓励你看看 this project 我是在codeplex上创建的。它提供了一个 Application 派生类,它封装逻辑以创建单实例/多实例感知的WPF应用程序,同时处理实例间通信(即主应用程序可以接收传递给后续实例的参数)。 源代码是可用的,因此您甚至可以检查全局互斥体和一些waithandle是否用于确保同步。

    要直接回答您的问题,获取全局互斥体的正确位置位于 Application.Startup 方法,因为它是在 Application.Run 方法,可被视为等同于程序 Main (当然,这不是同一件事,但是为了拥有一个实例应用程序就足够了)。

        3
  •  0
  •   Joel Barsotti    16 年前

    看起来最大的问题是,当默认情况下调用Startup时,它在主窗体上调用Show()。

    因为这意味着函数将返回,并像我链接的原始示例一样将启动调用包装在互斥体中,所以互斥体上的锁将在启动后不久释放。如果您更改了statup从show()打开main到showdialog()的方式,它将按预期工作。

        4
  •  0
  •   thenonhacker    15 年前

    快速回答:

    in app.xaml:将应用程序更改为InstanceAwareApplication

    在app.xaml.cs中:将应用程序更改为InstanceAwareApplication 并重写OnStartup(StartupEventArgs e,Bool IsFirstInstance)

    然后按照下面的示例操作: http://wpfinstanceawareapp.codeplex.com/SourceControl/changeset/view/53538#530411