如何让两个不同的c#应用程序在一个连续的线程中访问同一个目录

本文关键字:连续 一个 线程 访问 同一个 两个 应用程序 | 更新日期: 2023-09-27 18:04:46

我有相同的 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);
           }
       }        

如何让两个不同的c#应用程序在一个连续的线程中访问同一个目录

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

如果你在多个应用程序中有相同的代码,那么布尔值不会切断它的同步,无论你做什么:每个应用程序都有自己的布尔值副本,并且不能修改另一个。

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

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

查看此链接了解更多信息:c#中的监视器与互斥

不,它不会——至少,您粘贴的代码不会完成任何有意义的进程同步。

如果你想要一个更详细、更有用的答案,你需要更具体地说明你在做什么。

你必须想出某种跨进程同步方案——如果你试图防止两个进程之间的冲突,而不是两个线程运行在同一个进程上,那么你在代码中使用的任何锁定机制都是无关紧要的。

像这样跨进程进行锁定的一个好方法是使用文件。第一个进程创建一个文件,并以独占访问权限打开它,然后在完成后删除它。第二个进程要么看到文件存在,必须等待,直到它不存在,要么在尝试独占打开文件时失败。

no, 'flag'对于方法的作用域是局部的,而对于线程的作用域是局部的。换句话说,它也等于false。

这就是锁函数的作用。像这样使用在你的类中,声明一个私有对象gothread。

在你的方法中这样写

lock(gothread)
{
// put your code in here, one thread will not be able to enter when another thread is already
// in here
}