我在两个同时运行的应用程序中有相同的 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);
}
}
答案 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)
在这样的进程中执行锁定的好方法是使用文件。第一个进程创建一个文件并使用独占访问权限打开它,然后在完成后删除它。第二个进程将看到该文件存在并且必须等到它不存在,否则它将在尝试独占打开文件时失败。