Mutex不释放
我的C#Winform解决方案包含多个项目,包括一个包含FRMADMIN的管理项目和包含FRMUSER的用户项目.第三个项目包含一个定期启动FRMUSER的计时器的FRMTIMER. 我希望frmtimer在Frmadmin开放时不要启动frmuser. 我正在使用名为sutex来告诉frmtimer是否打开frmadmin;但是,在Frmadmin关闭后,静音似乎不会释放. MUTEX是在Frmadmin中创建的,具有这样的代码: public partial class frmAdmin : Form { Mutex m; protected override void OnShown(EventArgs e) { base.OnShown(e); m = new Mutex(true, "frmAdmin"); } protected override void OnClosed(Eve
0 2024-04-16
编程技术问答社区
释放一个在WPF Application.OnStartUp()中创建的命名的mutex。哪个线程拥有它?
i在WPF应用程序的OnStartup方法中创建一个sutex. MUTEX在程序中没有在其他任何地方使用,其唯一目的是防止某些程序同时运行.应用程序关闭时如何释放此Mutex? 根据假设我的OnStartup方法看起来像这样: public partial class App : Application { private Mutex mutex; private bool hasHandle = false; protected override void OnStartup(StartupEventArgs e) { bool createdNew; mutex = new Mutex(false, @"Global\XYZ", out createdNew); try { hasHandle = mutex.WaitOne(5000, false
0 2024-04-16
编程技术问答社区
单个应用实例的WPF突变器不工作
我正在尝试使用MUTEX方法仅允许我的应用程序的一个实例运行.也就是说 - 我只想为机器上的所有用户提供一个实例.我已经阅读了有关此问题的其他各种线程,解决方案似乎很简单,但是在测试中,我无法让第二个实例不运行.这是我的代码... public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { // check that there is only one instance of the control panel running... bool createdNew = true; using (Mutex instanceMutex = new Mutex(true, @"Global\ControlPanel", out createdNew)) {
0 2024-04-14
编程技术问答社区
如何发现C#中的Mutex被收购?
我如何从c#中的静音句柄中找到一个互斥品? 当mutex.WaitOne(timeout)超时时,它返回false.但是,如何从静音手柄中找到它? (也许使用P/Invoke.) 更新: public class InterProcessLock : IDisposable { readonly Mutex mutex; public bool IsAcquired { get; private set; } public InterProcessLock(string name, TimeSpan timeout) { bool created; var security = new MutexSecurity(); security.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.Wo
0 2024-04-14
编程技术问答社区
怎样才能摆脱一个被遗弃的突变体?
摘要: 如果创建的过程已经死了并且消失了? 详细信息: 我使用Mutex来确保仅运行一个实例. 测试一些新代码(进行自动更新)时,我运行了环境.EXIT(0).在调试模式下跑步时,我的静音被罚款. 但是,当我将构建更改为"释放"时,静音在退出呼叫后留在周围,并将其标记为放弃: 我已经进行了双检查,以确保没有一个过程仍在运行该utex. . 现在,每次我运行应用程序时,它都认为Mutex仍然存在,并且不会启动我的应用程序. (它也崩溃了,因为它试图将消息发送到应用程序的"当前运行"实例以显示自身.) 我试图这样释放静音: bool createdNew; string applicationId = "18773:TestStudio"; var singleInstanceMutex = new Mutex(true, applicationId, out createdNew); singleInstanceMutex.Close();
0 2024-04-14
编程技术问答社区
可靠地检测到我的另一个应用程序正在运行
我有两个应用程序,一个Winforms应用程序和Windows Service都将在同一台计算机上运行.我希望Winforms应用程序可靠地检测服务何时运行.我完全控制了这两个应用程序的设计和实施. 我的第一个想法是使用 mutex ,由服务实例化,可通过Winforms应用程序检测. 有更好的设计吗? 解决方案 Mutex是必经之路.它比使用过程名称等要脆弱得多. 但是,您需要确保未收集静物.对于服务(这是事件驱动而不是具有完成完成的"主要"方法),最明智的方法可能是将其放在静态变量中. 服务停止时处置互斥品,因此您无需等待最终确定或类似的内容. 其他解决方案 k.斯科特·艾伦(Scott Allen为此目的,Mutex和GC遇到的问题. 如果我只想在计算机上的所有会话中运行一个应用程序的实例,则可以将命名的互联克放入带有前缀" global \"的全局名称空间中. [STAThread] static void Main() {
0 2024-04-14
编程技术问答社区
如何使用mutex
我有一个线程,即通过TCP发送存储在类型列表的缓冲区中的数据.另一个线程是写入缓冲区.由于我对C#不太熟悉,我想知道如何正确使用锁定或静音. 这是我最终想使用的代码: while(buffer.isLocked()) { buffer.wait(); } buffer.lockBuffer(); buffer.add(tcpPacket); buffer.unlockBuffer(); buffer.notify(); 这是我当前的代码.我希望有人可以帮助我完成它. public class Buffer { private Mutex mutex; private List buffer; private bool locked = false; public Buffer() { mutex = new Mutex(false);
0 2024-04-14
编程技术问答社区
单一实例的windows窗体应用程序,如何获得其上的参考?
我有一个Windows表单应用程序,该应用程序只允许一个实例在当时运行.我已经使用Mutex实现了Singleton.该应用程序必须是从命令行(有或没有参数)启动的.应用程序启动并由脚本退出.用户无法对此采取任何行动. 因此,应用程序目的是简单的"指示"应用程序,它将仅显示一些视觉和图形信息.最终用户无能为力,只需看到它即可.它是Windows Forms应用程序,因为随后视觉和图形外观相对容易实现(您可以将其最高,无边框等.). . 简单地说: 当某人试图使用Exit Commandline参数运行同一应用程序时,如何退出当前运行应用程序? bool quit = (args.Length > 0 && args[0] == "quit") ? true : false; using (Mutex mutex = new Mutex(false, sExeName)) { if (!mutex.WaitOne(0, true)) { i
0 2024-04-13
编程技术问答社区
释放一个Mutex
我有一个Web应用程序,需要利用应用程序缓存来存储数据(由于逐个请求获得该数据请求的高间接开销).请参阅上一篇文章,网址为 https://stackoverflow.com/a/a/a/16961962/236860 这种方法似乎很好,但是我看到网站错误中的偶尔出现错误: System.ApplicationException: Object synchronization method was called from an unsynchronized block of code. at System.Threading.Mutex.ReleaseMutex() at InboxInsight.Web.Web_Controls.Twitter.TwitterFeed.GetTwitterData(HttpContext context) at InboxInsight.Web.Web_Controls.Twitter.TwitterFeed.ProcessRequest(Ht
0 2024-04-13
编程技术问答社区
创建Mutex时出现 "找不到路径的一部分 "的错误
我对此感到困惑,有人可以告诉我为什么,当我打电话时: using (Mutex mtx = new Mutex(false, strId)) { } 我得到这个例外: 找不到路径的一部分. 如果strId设置为localhost\SQLEXPRESS-MyName-2? 之类的东西 解决方案 来自docs :: 在运行终端服务的服务器上 可以具有两个能见度.如果其名称以前缀开头 "全局\",在所有终端服务器会话中都可以看到MUTEX.如果 它的名称从前缀" local \"开始,仅在 创建它的终端服务器会话.在这种情况下, 彼此之间的单独静音可以存在 服务器上的终端服务器会话.如果您不指定前缀 当您创建一个命名的Mutex时,它将使用前缀" local \".在一个 终端服务器会话,两个名字仅与他们的名称不同 前缀是单独的静音,两者都可以看到所有过程 在终端服务器会话中.也就是说,前缀名称" Global \" 和" local \"描述了静音名称相对于
0 2024-04-13
编程技术问答社区
如何获得 "Everyone "的IdentityReference以在本地化系统上创建MutexAccessRule?
我想在/a>或 a>创建一个系统宽sutex. 这在大多数系统上都可以正常工作,但是在德语XP安装上,我会发现"某些或所有身份参考无法翻译"的错误.问题在于该系统上的"每个人"小组被称为" Alle". 那么,如何获得正确的身份证来为所有独立于OS语言的系统上的" EverOne"或"用户"创建一个静音量? 解决方案 刚刚通过继续搜索找到了解决方案.请参阅此问题的答案: new SecurityIdentifier(WellKnownSidType.WorldSid, null) 这可以使用而不是"每个人". 如果发现正确的话,有人可以在这里标记这个问题吗?
0 2024-04-13
编程技术问答社区
如何优雅地从AbandonedMutexException中脱身?
我使用以下代码同步了几个运行过程之间共享资源的相互排斥访问. Mutex是这样创建的: Mutex mtx = new Mutex(false, "MyNamedMutexName"); 然后我使用此方法输入互斥部分: public bool enterMutuallyExclusiveSection() { //RETURN: 'true' if entered OK, // can continue with mutually exclusive section bool bRes; try { bRes = mtx.WaitOne(); } catch (AbandonedMutexException) { //Abandoned mutex, how to handle it? //bRes = ? } cat
0 2024-04-13
编程技术问答社区
返回语句应该在锁的内部还是外部?
我只是意识到,在我的代码中的某个地方,我在锁定内有返回语句,在外面的某个时候.哪一个是最好的? 1) void example() { lock (mutex) { //... } return myData; } 2) void example() { lock (mutex) { //... return myData; } } 我应该使用哪一个? 解决方案 本质上,哪个使代码更简单.单点退出是一个不错的理想,但是我不会只是为了实现形状而弯曲代码...如果替代方案正在宣布局部变量(锁外),请初始化它(锁定)和然后将其返回(在锁外),然后我会说锁内的一个简单的"返回foo"要简单得多. 要显示IL的差异,让代码: static class Program { static void Main() { } static readonly obj
0 2024-04-13
编程技术问答社区
如何在C#中创建一个系统互斥?
如何使用相同的非管理资源创建一个系统/多进程互联克来协调多个过程. 背景: 我编写了一个使用文件打印机的过程,该过程一次只能由一个过程使用.如果我想在计算机上运行的多个程序上使用它,我需要一种在整个系统上同步的方法. 解决方案 有一个构造函数超负荷以检查现有的静音. 所以... void doWorkWhileHoldingMutex() { Console.WriteLine(" Sleeping..."); System.Threading.Thread.Sleep(1000); } var requestInitialOwnership = true; bool mutexWasCreated; Mutex m = new Mutex(requestInitialOwnership, "MyMutex", out mutexWasCreated); if (requestInitialOwnership && m
0 2024-04-12
编程技术问答社区
我应该处置一个Mutex吗?
我正在使用具有一个通用数据库的2个Windows服务,我想用系统互斥锁定(交叉程序). 现在,我想知道是否可以在try-finally块中调用WaitOne()和ReleaseMutex(),还是应该处置Mutex(例如,在using块中).如果是这样,我想我应该始终在WaitOne()方法上捕获AbandonedMutexException,或者我在这里错了? 解决方案 mutex是一个Windows内核对象(此处包裹在.NET对象中). 因此,这是一个不受管理的资源. 更准确地说,.NET对象包含二线手柄,必须以某种方式释放/处置. 我不信任另外,请注意, close()也会处理对象. 当然,即使您不使用它,将现有的Mutex对象保留在您的应用中也没有错.它们是轻型资源. 其他解决方案 根据 a>一个名称用非管理的术语msdn说 使用CloseHandle函数关闭手柄.当过程终止时,系统会自动关闭手柄.穆特克斯对象关闭最后一个手柄时
6 2024-04-12
编程技术问答社区
跨用户的C#突变器
我的应用被迫使用第三方模块,如果同时在同一台计算机上同时启动了两个实例,该模块将蓝屏窗口.为了解决这个问题,我的C#应用​​具有互斥性: static Mutex mutex = new Mutex(true, "{MyApp_b9d19f99-b83e-4755-9b11-d204dbd6d096}"); 我检查是否存在 - 如果是这样,我显示了一个错误消息并关闭应用程序: bool IsAnotherInstanceRunning() { if (mutex.WaitOne(TimeSpan.Zero, true)) return (true); else return (false); } 问题是,如果两个用户可以同时登录并打开应用程序,而IsanotherInstancerunning()将返回false. 我该如何解决? 解决方案 前缀" global \"的静音名称. static M
0 2024-04-12
编程技术问答社区
c#中Mutex的用法
我在 c#中的线程中有些新,一般而言 在我的程序中,我使用mutex仅允许1个线程进入关键部分,出于做一些CW打印的未知原因,我可以看到,有一个以上的线程进入了我的关键部分,这是我的代码: Mutex m = new Mutex(); m.WaitOne(); // critical section here m.ReleaseMutex(); 我非常想知道我是否在这里犯了一个错误,谢谢您的帮助. 编辑: 我的代码包括类,因此基本上看起来更像: public class test { private mutex m; public test() { m = new mutex(); } public func() { m.WaitOne(); // critical section here m.ReleaseMutex(
0 2024-04-12
编程技术问答社区
从一个非同步的代码块中调用了对象同步方法。Mutex.Release()时出现异常
我发现了有关此例外的不同文章,但没有一个是我的情况. 这是源代码: class Program { private static Mutex mutex; private static bool mutexIsLocked = false; static void Main(string[] args) { ICrmService crmService = new ArmenianSoftware.Crm.Common.CrmServiceWrapper(GetCrmService("Armsoft", "crmserver")); //Lock mutex for concurrent access to workflow mutex = new Mutex(true, "ArmenianSoftware.Crm.Common.FilterCtiCallLogActivi
0 2024-04-12
编程技术问答社区
WPF单实例最佳实践
这是我到目前为止实施的代码,以创建一个实例WPF应用程序: #region Using Directives using System; using System.Globalization; using System.Reflection; using System.Threading; using System.Windows; using System.Windows.Interop; #endregion namespace MyWPF { public partial class MainApplication : Application, IDisposable { #region Members private Int32 m_Message; private Mutex m_Mutex; #endregion #region Methods: Functions
2 2024-04-12
编程技术问答社区
如何运行一个c# WinForm应用程序的一个实例?
我有一个C#应用程序,该应用程序在启动时显示登录表单,并在用户身份验证后显示主表单.我使用Mutex限制了我的应用程序的一个实例.而且,这仅适用于登录表单.一旦显示了主表单,就不会限制用户重新打开登录表单.我正在寻找一个解决方案,一旦打开主表单,就无法显示登录屏幕. 这是我的program.cs [STAThread] static void Main() { bool mutexCreated=true; using (Mutex mutex = new Mutex(true, "eCS", out mutexCreated)) { if (mutexCreated) { Application.EnableVisualStyles(); Application.SetCompatibleText
2 2024-04-12
编程技术问答社区