gpt4 book ai didi

c# - 释放在 WPF Application.OnStartUp() : Which thread owns it? 中创建的命名互斥量

转载 作者:可可西里 更新时间:2023-11-01 10:05:13 25 4
gpt4 key购买 nike

我在 WPF 应用程序的 OnStartup 方法中创建了一个互斥量。互斥量在程序的其他任何地方都没有使用,它的唯一目的是防止某些程序并发运行。如何在应用程序关闭时释放此互斥量?

根据documentation , mutex.ReleaseMutex() 必须从创建互斥锁的同一个线程调用。然而,这会带来一个问题,因为我不控制调用 OnStartup() 的线程。

假设我的 OnStartup 方法如下所示:

public partial class App : Application
{
private Mutex mutex;
private bool hasHandle = false;

protected override void OnStartup(StartupEventArgs e)
{
bool createdNew;
mutex = new Mutex(false, @"Global\XYZ", out createdNew);
try
{
hasHandle = mutex.WaitOne(5000, false);
if (!hasHandle)
{/*do stuff*/};
}
catch (AbandonedMutexException)
{
hasHandle = true;
// do stuff
}
base.OnStartup(e);
}

private void releaseMutex()
{
if (mutex!=null)
{
if (hasHandle) mutex.ReleaseMutex();
mutex.Dispose();
}
}
}

是否保存调用releaseMutex() ...

  • 在 OnExit() 方法中?
    protected 覆盖 void OnExit(){releaseMutex();}
  • 在 ProcessExit 事件处理程序中?
    AppDomain.CurrentDomain.ProcessExit += (sender,e)=> releaseMutex();
  • 在终结器中?
    ~App(){releaseMutex();}
  • 在未处理的异常事件处理程序中?
    AppDomain.CurrentDomain.UnhandledException += (sender,e)=> releaseMutex();

似乎 OnExit 方法最有可能出现在同一个线程中,但即便如此,这似乎也是一个粗略的假设。有没有办法忽略相同线程的要求?或者我应该创建并存储一个单独的线程与我的互斥锁一起使用吗?

最佳答案

我个人根本不会费心去释放它,尤其是因为你处理了 AbandonedMutexException

如果互斥锁不用于同步同一进程的线程,则无需显式释放它。当进程终止时,操作系统会自动关闭该进程创建的所有句柄,例如文件、套接字、互斥量、信号量和事件句柄。

如果您仍然喜欢释放它,请考虑使用 Application.OnExit(),因为它是从主线程调用的,就像 Startup() 一样。

关于c# - 释放在 WPF Application.OnStartUp() : Which thread owns it? 中创建的命名互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32535686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com