如何将 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 个 的相关文章

  • 访问特征矩阵的行向量时复制或引用

    我正在使用的代码Eigen http eigen tuxfamily org index php title Main Page矩阵库 我注意到在整个代码中 有如下访问器 RowVector3f V size t vertex index
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • 在 T4 代码生成中,如何从引用的程序集中获取类型?

    由于 T4 在项目上下文之外运行 因此我无权访问当前程序集或其他程序集 如何注册对引用程序集的访问 然后从中获取类型 我猜您想访问项目中建筑物的程序集 我在下面的示例代码中所做的是将一个名为 TestLib 的项目添加到我的解决方案中 我将
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • 使用 (float&)int 进行类型双关可以正常工作,(float const&)int 会像 (float)int 一样转换吗?

    VS2019 发布 x86 template
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 我应该使用 Helgrind 还是 DRD 进行线程错误检测?

    好像Valgrind http valgrind org docs manual manual html有两个工具都可以进行线程错误检测 Helgrind http valgrind org docs manual hg manual ht
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 从 cin 读取整数序列并将它们存储在向量中

    这就是我读取整数的方法std cin并将它们存储在向量中 int number vector
  • 来自用户定义文字的整数字符序列,以字符串作为参数

    目前 只有双精度数可以在用户定义的文字中生成字符模板 template
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 查找文本文件中每行的行大小

    如何计算每行中的字符或数字数量 是否有类似 EOF 的东西更像是行尾 您可以遍历行中的每个字符并不断增加计数器直到行尾 n 遇到 确保以文本模式打开文件 r 而不是二进制模式 rb 否则流不会自动将不同平台的行结束序列转换为 n 人物 这是
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的

随机推荐

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

    我是 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 测试环境 每个用户仍然能够启动多个实例