簡體   English   中英

如何將Citrix中的C#程序實例限制為每用戶1個

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM