[英]How to limit instances of a C# program in Citrix to 1-per-user
我有一個帶有C#代碼的Windows Forms應用程序,如下所示(針對.NET Framework 4)。
在我的開發人員工作站上,此代碼可防止我啟動該程序的多個實例。 但是,質量檢查具有Citrix測試環境,每個用戶仍然可以啟動多個實例。
如何防止給定用戶在Citrix中運行多個實例?
[STAThread]
static void Main(string[] args)
{
bool isFirstInstance;
Mutex m = new Mutex(true, "[App name goes here] mutex", out isFirstInstance);
if (isFirstInstance)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run();
// Prevent the just-in-time (JIT) compiler from optimizing away our Mutex.
// See: http://www.ai.uga.edu/mc/SingleInstance.html
GC.KeepAlive(m);
}
}
由於技術原因,我們希望限制實例的數量。 該程序使用自托管WCF與同一用戶正在運行的另一個進程進行通信。 我們只希望每個用戶一個該程序的實例。
我不知道有關Citrix環境的任何詳細信息,但可以查詢。
謝謝。
根據所需的確切行為,可以使用本地或全局范圍的互斥鎖。
將互斥鎖與“ Local \\”一起使用將確保每個會話僅運行一個實例。 但是,您的用戶仍然有可能在同一服務器上啟動多個會話(取決於Citrix環境的配置方式),從而使您的應用程序的多個實例在不同的會話中運行。
如果要成為100%,每個用戶每個服務器只能有一個實例,則需要使用全局互斥鎖。 但是,您需要確保使用特定於用戶的狀態來命名互斥鎖,例如
string globalMutexName = string.Format(
CultureInfo.InvariantCulture,
"Global\\AppName~{0}~{1}~some-unique-guid",
Environment.UserDomainName,
Environment.UserName);
_machineLocalAppInstanceMutex = new System.Threading.Mutex(true, globalMutexName, out mutexIsNew);
if (!mutexIsNew)
{
Shutdown();
}
另外,我會讓互斥鎖成為類的成員,通常是您的主App / Form類,而不是使用GC.KeepAlive
使用全局互斥鎖。 代碼的方式是,您可以在不同的用戶會話中啟動程序的多個實例...全局互斥鎖可以防止該情況...
最簡單,最好的解決方案是使用互斥鎖,這是該代碼。
static void Main(string[] args)
{
String mutexName = "MyApplication" +
System.Security.Principal.WindowsIdentity.GetCurrent().User.AccountDomainSid;
Boolean createdNew;
Mutex mutex = new Mutex(true, mutexName, out createdNew);
if (!createdNew)
{
//If createdNew is false that means an instance of application is already running for this
// user.
//So in this case stop the application from executing.
return;
}
Console.ReadKey();
}
您可以在此鏈接中找到詳細的說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.