如何让两个不同的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);
}
}
在一个层面上,根据您正在做的事情,让多个应用程序访问同一个目录或文件并没有什么问题。如果它只是读访问,那么无论如何,两者都可以同时访问它。
如果你在多个应用程序中有相同的代码,那么布尔值不会切断它的同步,无论你做什么:每个应用程序都有自己的布尔值副本,并且不能修改另一个。
对于跨应用程序同步,我将使用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
}