[英]prevent a c# application from running more than one instance
我在c#中編寫了一個程序,現在我想知道如果程序已經運行,阻止程序啟動的正確方法是什么?
因此,如果它已經在運行,並且雙擊該程序,它將無法啟動,因為它已經在運行。
我可以這樣做,但我正在考慮一種標准和正確的方式。
建議的方法是使用系統互斥鎖。
bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
if (createdNew)
// first instance
Application.Run();
else
MessageBox.Show("There is already an instace running");
}
Mutex ctor的第一個參數告訴它為該線程創建一個系統范圍的互斥鎖。 如果互斥鎖已經存在,它將通過第3個參數返回false
。
更新
把它放在哪里? 我把它放在program.cs中。 如果將其放在form_load中,則需要在應用程序的生命周期內保留互斥鎖(將互斥鎖作為表單上的成員),然后以卸載形式手動釋放它。
在其他應用程序打開數據庫連接等之前以及為表單/控件等創建資源之前,您越早調用它越好。
我在其中一個應用程序中執行的快速方法。您可以查看正在運行的進程列表,以查看當前應用程序是否已在運行而不是再次啟動應用程序。
Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
// The TestApplication is already running, don't run it again
}
我認為枚舉進程列表可能會很慢。 您還可以使用System.Threading.Mutex類創建一個Mutex,並檢查它是否已在進程啟動時創建。 但是,這需要調用Win32系統代碼,因此不會完全與平台無關。
看一下Scotts博客文章 ,不要被程序集名稱弄得愚蠢。 它只是.Net框架中標准文件的文件名。
以下是MSFor for WindowsFormsApplicationBase的更多信息。
您可以使用系統范圍的信號量 ,使用信號量構造函數(Int32,Int32,String,Boolean%)構造函數和一個相當獨特的名稱。
干杯,馬蒂亞斯
如果您的應用程序生成/使用文件,那么您最好注冊系統范圍的通信機制(例如遠程處理或WCF端點,甚至是套接字)。 然后,如果通過雙擊其中一個文件啟動應用程序的第二個實例,則可以將文件信息發送到正在運行的實例。
否則,如果它是一個獨立的程序,那么正如其他人所說的那樣,Mutex或Semaphore同樣可以服務。
Windows窗體應用程序中的解決方案禁止再次運行應用程序(重新打開應用程序)。
1-首先添加Class RunAlready.cs
2-Call方法processIsRunning(),帶ProgramCs中RunAlready.cs的Name Process
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tirage.MainStand
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
string outApp = RunAPP.processIsRunning("Tirage.MainStand");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
if (outApp.Length == 0)
{
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new MainStand_masterFrm());
}
}
else MessageBox.Show( "Instance already running");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PublicClass.Class
{
public class RunAlready
{
public string processIsRunning(string process)
{
string xdescription = "";
System.Diagnostics.Process[] processes =
System.Diagnostics.Process.GetProcessesByName(process);
foreach (System.Diagnostics.Process proc in processes)
{
var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
{
xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
xdescription += "Virtual memory size : " + proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
}
}
return xdescription;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.