【问题标题】:Will mutex work across multiple instances in .Net互斥量是否可以在 .Net 中跨多个实例工作
【发布时间】:2014-10-03 03:27:39
【问题描述】:

我是这个论坛的新手,请耐心等待我的第一篇文章。我正在开发一个从 VB6 迁移的 .Net 应用程序,它使用同一类的多个实例进行多处理。但是 .Net 中的一个文件操作比 vb6 花费的时间更长,这在 .Net 中引起了问题,因为侦听器用于监视它。我想知道是否可以使用互斥锁来锁定此方法(具有文件操作),以便没有其他实例将执行此代码。代码如下。

Main()
{
FileWriter objA = new FileWriter()
FileWriter objB = new FileWriter() 
...
objA.CreatePDFFile()
objB.CreatePDFFile()
...
}

Class FileWriter
{

bool CreatePDFFile()
{
using ( Mutex mutx = new Mutex( false, @"Global\" + appGuid)
{  
   mutx.WaitOne();
   ....//File operations code over here
   mutx.ReleaseMutex()

}
}
}

如果上述方法可行,请告诉我。

【问题讨论】:

    标签: .net locking mutex multiple-instances


    【解决方案1】:

    互斥锁通过在任何给定时间仅由单个线程持有来同步访问。您的代码将阻止FileWriter.CreatePDFFile() 的多个实例同时执行。

    因为它使用 named 互斥体,所以它还将同步系统上进程之间的访问,例如使用FileWriter 类的所有应用程序的所有实例。

    您对模拟的描述令人困惑。如果您只运行一个使用该类的进程,并且该进程只有一个线程,则互斥锁将不起作用。

    【讨论】:

    • 感谢您的信息。我只希望 mutex 块内的代码在任何时间点仅由一个实例执行。我过去曾研究过多线程,但这是我唯一一次遇到同一类和方法的多个实例。我将其称为多进程模拟可能是错误的。明天我会测试它,并会进一步更新。
    • 为多个实例同时运行代码的唯一方法是拥有多个线程。多进程是穷人运行多线程的方式。 (好吧,还有另一种方法,尽管它似乎不适用于这里。您可以有一个实例方法为不同的实例调用自身,例如递归列表。在这种情况下,不会出现阻塞或死锁,因为mutex 由正在访问所有实例的线程拥有。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2021-04-16
    相关资源
    最近更新 更多