c#中应用的单个实例

时间:2016-01-05 17:39:14

标签: c# instance

我知道这个问题可能有点傻,但我是c#的新手,也是一般的编码。 我最近创建了一个应用程序,我想限制它只有一次运行它的一个实例,这样用户就无法多次启动它。 我在stackoverflow上找到了michalczerwinski的答案:

setRepositories(ind = 1:2)

谁能告诉我应该在哪里添加这个?我尝试在Form1.cs中的任何地方添加它,但它无法正常工作。

3 个答案:

答案 0 :(得分:2)

mutex.Dispose();

是主要功能的名称。你应该把它添加到" Program.cs"该特定函数的文件(标准名称)(在函数中的所有其他内容之前)

免费资源是一种很好的做法。因此,最好在函数末尾添加using (mutex) { }[((u'en', 1),[('term1', 2),('term2', 8),('term3', 6))] (不是两者,只有其中一个选项)。

答案 1 :(得分:1)

(更新:我显然没有仔细阅读你的问题,因为你有一个单一实例的方法,只是想知道在哪里添加它。无论如何,我认为这个答案仍然有用,因为它提供了一个单实例应用程序的好方法,具有更多可能性,无需在您自己的代码中处理互斥锁。

您可以从WindowsFormsApplicationBase派生一个类,将IsSingleInstance属性设置为true并覆盖OnCreateMainForm方法。 您需要在项目中引用Microsoft.VisualBasic.dll

Here是如何使用WindowsFormsApplicationBase来处理进一步的流程启动并调用已经运行的实例的一个很好的例子。

继承类:

public class App : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
    public App()
    {
        // Make this a single-instance application
        this.IsSingleInstance = true; 
        this.EnableVisualStyles = true;
    }

    protected override void OnCreateMainForm()
    {
        // Create an instance of the main form 
        // and set it in the application; 
        // but don't try to run() it.
        this.MainForm = new Form1();
    }
}

你的主要方法现在看起来像这样:

static void Main(string[] args)
{
    App myApp = new App();
    myApp.Run(args); 
}

答案 2 :(得分:0)

对我来说,互斥解决方案无效,因此我使用了Process方法。它基本上检查是否有其他实例在运行。您必须将其放置在Program.cs之前的Application.Run()文件中。

if (Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location)).Length > 1)
        {
            MessageBox.Show("Another instance of this program is already running. Cannot proceed further.", "Warning!");
            return;
        }

这是到目前为止最简单的方法,至少对我而言。

编辑::该方法最初发布于here