我知道这个问题可能有点傻,但我是c#的新手,也是一般的编码。 我最近创建了一个应用程序,我想限制它只有一次运行它的一个实例,这样用户就无法多次启动它。 我在stackoverflow上找到了michalczerwinski的答案:
setRepositories(ind = 1:2)
谁能告诉我应该在哪里添加这个?我尝试在Form1.cs中的任何地方添加它,但它无法正常工作。
答案 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。