如何将 Citrix 中的 C# 程序实例限制为每用户 1 个

2024-04-14

我有一个带有 C# 代码的 Windows 窗体应用程序,如下所示(针对 .NET Framework 4)。

在我的开发人员工作站上,此代码可以阻止我启动该程序的多个实例。但是,QA 有一个 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Citrix 中的 C# 程序实例限制为每用户 1 个 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud

随机推荐

  • 如何制作移动散点的动画

    我是 Python 初学者 我正在尝试制作一个沿水平方向移动的点的动画 但是 当我运行代码时 我收到以下错误 TypeError PathCollection object is not iterable 我不知道如何解决它 import
  • SQL 存储过程 IF EXISTS UPDATE ELSE INSERT

    好的 我得到了很多帮助here https stackoverflow com questions 11906506 sql server 2008 if not exists insert else update之前使用 SQL 后端来实
  • 添加始终显示在屏幕底部的页脚?

    即使页面内容非常小 如何添加始终位于屏幕底部的页脚 例如 假设我有一个页面没有显示太多内容 因此页脚位于屏幕中间 我能否确保如果页面内容不多 则页脚位于屏幕底部 UPDATE 我只想要一个位于屏幕底部的页脚 当没有足够的内容来填充整个屏幕时
  • 如果A、B、C上有索引,A、B上的索引是否多余?

    拥有多年的 DBA 经验 我确实相信我知道问题的答案 但我认为检查一下我的基础总没有坏处 使用 SQL Server 假设我有一个在列上有索引的表A和列B 以及列上的第二个索引A B and C 删除第一个索引是否安全 因为第二个索引基本上
  • 64 位 delphi 应用程序中的 {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

    Does SetPEFlags IMAGE FILE LARGE ADDRESS AWARE 对64位delphi应用程序有什么影响吗 它根本没有任何作用 所有 64 位进程都会自动判定为大地址感知
  • 使用新的 gradle 插件发布到 Sonatype:maven-publish

    到目前为止 我正在使用 Gradle 将 java 工件上传到 Sonar Nexusupload任务 例如 https github com oblac jodd blob master gradle publish maven grad
  • 有没有办法在 occi 中预取 LOB 数据?

    我正在开发一个以 Oracle 作为数据库的 C 应用程序 并尝试使用 CLOB 数据类型获取数千条记录 一直在网上搜索如何在 OCCI 中预取 CLOB 数据类型 但总是看到 如果 LONG LOB 或不透明类型列 例如 XMLType
  • Firebase:将 Facebook 帐户与现有用户关联

    我在 Firebase 中有一个当前数据库 其中包含可以使用 user pwd 登录的活动用户 但现在我正在实现 facebook 登录 并且我意识到将 facebook 帐户与现有用户链接的唯一方法只有当用户已经登录时用户 密码 但不是在
  • 如何调用 MemberwiseClone()?

    我对如何使用感到困惑MemberwiseClone 方法 我在 MSDN 中查看了示例 他们通过this关键词 为什么我不能像其他对象的方法一样直接调用它GetType or ToString 另外一个没有出现的相关方法是ShallowCo
  • 如何使用 Chrome 和 FireFox JAVA 的 webdriver 禁用 cookie

    我想启动浏览器 FF CHROME 以禁用 cookie 进行测试 我尝试了以下方法 service new ChromeDriverService Builder usingDriverExecutable new File src te
  • Postgres JDBC 驱动程序:PSQLException:返回时或附近出现语法错误

    由于某种原因 JDBC PostgreSQL 驱动程序正在添加 返回 到 select 语句的末尾 为什么 Code protected static final String AUTH QUERY SELECT SECRET FROM u
  • 未重定向到 Codeigniter 4 中的特定 URL

    为什么每当我通过 Codeigniter 4 控制器的构造函数重定向某些内容时就不起作用
  • 在php中获取今天和昨天的时间戳

    如何使用php中的strtotime 函数获取今天 昨天和前天12点的时间戳 12 点钟是一个变量 可以由用户更改 hour 12 today strtotime hour 00 00 yesterday strtotime 1 day t
  • 我可以在 Visual Studio (c++) 中设置断点以在线程上下文切换时中断吗?

    我们只想打破某个线程 知道该怎么做吗 我似乎找不到打破这个条件的方法 我应该在文字中更具体 正如标题所示 我想中断上下文切换到线程中 您需要设置断点过滤器 右键单击断点并选择 Filter 选项 它将显示一个对话框 允许您将断点过滤到特定的
  • 在覆盖 ProcessCmdKey EventHandler 时跳过 KeyDown

    我通过按向下箭头键在文本框上进行了简单的增量 如下所示 protected override bool ProcessCmdKey ref Message msg Keys keyData if keyData Keys Down int
  • CLLocationManager 坐标

    我一直致力于实现步行 骑自行车和开车的路线跟踪图 然而 正如您在下面的屏幕截图中看到的那样 即使我没有步行 骑自行车或开车前往该位置 我的坐标也会时不时地突然跳跃 在图像上画了圆圈来指出问题 我的问题是为什么坐标突然跳跃 这是我的实施快照
  • IP_RECVERR 的 OSX 等效项

    我正在尝试将 TraceRoute 程序从 Linux 移植到 OSX 但在找到 IP RECVERR 等效项时遇到问题 大多数人进行数据包解析的方式是 setsockopt sock IPPROTO IPV4 IP RECVERR on
  • 车把中的“{{{variable}}}”是什么意思?

    三重花括号在车把模板语法中意味着什么 例如 variable 我找不到任何文档 Thanks 因为它最初设计用于生成 HTML 所以 Handlebars 转义了由 expression 如果您不希望 Handlebars 转义值 请使用
  • Memcached 与 Windows 和 .NET

    有没有人已经在 Windows 环境中实现了 memcached 以供生产使用 因为我读过很多博客 不建议在 Windows 中运行 memcached 尤其是用于生产用途 例如在 Windows 上运行 memcached http la
  • 如何将 Citrix 中的 C# 程序实例限制为每用户 1 个

    我有一个带有 C 代码的 Windows 窗体应用程序 如下所示 针对 NET Framework 4 在我的开发人员工作站上 此代码可以阻止我启动该程序的多个实例 但是 QA 有一个 Citrix 测试环境 每个用户仍然能够启动多个实例