如何在连续线程中启用两个不同的C#应用​​程序访问同一目录?

时间:2011-08-08 23:13:06

标签: c# multithreading

我在两个同时运行的应用程序中有相同的 BackgroundWorker代码段。这段代码是否会避免同一资源被两个进程访问并顺利运行的问题?

void bw_DoWork(object sender, DoWorkEventArgs e)
    {
       bool flag = false;
       System.Threading.Thread.Sleep(1000);

       while (flag.Equals(false))
       {

           string dir = @"C:\ProgramData\Msgs";
           try
           {
               if (Directory.GetFiles(smsdir).Length > 0)
               {                      
                   flag = true;
               }

           }
           catch (Exception exc)
           {
               Logger.Log("Dir Access Exception: " + exc.Message);
               System.Threading.Thread.Sleep(10);
           }
       }        

6 个答案:

答案 0 :(得分:2)

不,它不会解决问题,因为设置布尔值并检查它不是原子函数,因此不是线程安全的。您必须使用Mutex或Monitor对象。

点击此链接了解详情:Monitor vs Mutex in c#

答案 1 :(得分:2)

在一个层面上,根据您正在做的事情,让多个应用程序访问同一目录或文件没有任何问题。如果它只是读访问权限,那么无论如何都可以一次访问它。

如果你在多个应用程序中有相同的代码,那么无论你做什么,布尔都不会削减它以进行同步:每个应用程序都有自己的布尔副本,而不能修改另一个。< / p>

对于跨应用程序同步,我使用Mutex类。有一个构造函数接受一个字符串参数,指定Mutex的名称。互斥名称在所有Windows中都是唯一的,而不仅仅是您的应用程序。您可以在两个不同的应用程序中执行Mutex m = new Mutex(false, "MySpecialMutex");,每个对象都将引用相同的内容。

答案 2 :(得分:0)

不,它不会 - 至少,您粘贴的代码不会实现任何有意义的流程同步。

如果您想要更详细和更有帮助的答案,您需要更具体地了解自己在做什么。

答案 3 :(得分:0)

不,'flag'是方法范围的本地,它是线程范围的本地。换句话说,它也将等于假。

这就是锁定功能的用途。像这样使用它 在你的类中,声明一个名为gothread的私有对象。

你方法中的

就像这样写

lock(gothread)
{

// put your code in here, one thread will not be able to enter when another thread is already
// in here

}

答案 4 :(得分:0)

您必须提出某种跨进程同步方案 - 如果您尝试阻止两个进程之间的冲突而不是两个,那么您在该代码中使用的任何锁定机制都无关紧要em> threads 在同一进程上运行。

答案 5 :(得分:0)

在这样的进程中执行锁定的方法是使用文件。第一个进程创建一个文件并使用独占访问权限打开它,然后在完成后删除它。第二个进程将看到该文件存在并且必须等到它不存在,否则它将在尝试独占打开文件时失败。