【问题标题】:How to determine if an instance of the .NET application from a certain location is running?如何确定某个位置的 .NET 应用程序实例是否正在运行?
【发布时间】:2012-01-16 18:23:11
【问题描述】:

如果应用程序从同一个文件夹启动,我需要禁止它,但如果同一个应用程序从其他文件夹运行,则允许它。

问题是当应用程序关闭时它变得不可见但仍然在内存中,因为它终止了一些内部工作。

当旧实例仍在内存中终止时,用户很可能会从同一文件夹快速再次启动此应用程序。

但是从另一方面来说,如果这个应用程序从其他文件夹运行应该是可能的。

任何线索如何在 C# 中做到这一点?


更新:

1

实际上,应用程序将一些日志写入子目录中的本地文件以及本地数据库文件中。所以很有可能两个实例之间存在一些冲突。

2

 Guid appGuid = Guid.Parse("305BACEA-4074-11E1-85E1-066E4854019B");

        public MainWindow()
        {
            InitializeComponent();


            using (Mutex mutex = new Mutex(false, @"Global\" + appGuid) )
            {

                if (!mutex.WaitOne(0, false))
                {
                    // MessageBox.Show("Instance already running");

                    // Somehow here I have to get the path of the running instance.
                    // If the path the same as the current instance has I have do ban starting instance.

                    return;
                }

                GC.Collect();              
            }

【问题讨论】:

  • 接近重复一个常见问题。您可以使用基于应用程序路径的命名互斥锁msdn.microsoft.com/en-us/library/system.threading.mutex.aspxstackoverflow.com/questions/819773/…
  • 这听起来有点像一个未说出口的问题的笨拙解决方案。如果您解释了为什么两个实例不能从同一个文件夹运行(或从同一个可执行文件启动,通过扩展)的原因,那么也许可以为您提出更好的解决方案。
  • @Lloyd 不清楚如何检测正在运行的应用程序的路径。
  • @Dmitry 您有程序在自己的目录中写入文件吗?不好...
  • @Lloyd - 单实例是一个非常常见的场景。 VS 在应用程序设置中轻松处理单个实例。但是,如果应用程序可以作为多个实例运行,那么这些实例是从单个可执行文件还是从相同的两个副本启动都无关紧要 - 有一个编程解决方案,我敢肯定,它可以更优雅地解决任何这里有冲突。

标签: c# .net windows mutex


【解决方案1】:

谢谢大家!

终于基于这个post我找到了解决办法:

public partial class App : Application
    {
        private Mutex _instanceMutex = null;

        protected override void OnStartup(StartupEventArgs e)
        {

            string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).Replace("\\", ".");

            // check that there is only one instance of the control panel running...
            bool createdNew;
            _instanceMutex = new Mutex(true, path, out createdNew);
            if (!createdNew)
            {
                _instanceMutex = null;
                MessageBox.Show("Instance already running");
                Application.Current.Shutdown();
                return;
            }

            base.OnStartup(e);
        }

        protected override void OnExit(ExitEventArgs e)
        {
            if (_instanceMutex != null)
                _instanceMutex.ReleaseMutex();
            base.OnExit(e);
        }

}

【讨论】:

    【解决方案2】:

    您可以使用锁定文件来指示程序已在文件夹上运行。

    当程序启动时,它会检查目录中的文件。如果找到它,它会关闭,如果没有,它会创建一个并正常运行。程序完成后,应该删除文件。

    这当然不是万无一失的。如果程序崩溃,文件不会被删除,用户可以在程序运行时删除文件,绕过初始检查。

    【讨论】:

    • 谢谢!是的,有可能实现它。但我很确定有一种方法可以通过 .net 类检测盯着应用程序实例的路径...
    • 不知道为什么这被否决了。如果应用程序可以处理我指出的问题,我提供的解决方案是可以接受的。这与 Lucene 用于锁定搜索目录的方法相同,确保只有一个实例正在写入该目录。
    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多