我有一个进程A读取其他进程B生成的一些数据。数据通过文件系统“交换”。为确保文件存在,进程A当前检查文件是否存在,如下所示:
while (!File.Exists(FileLocation))
{
Thread.Sleep(100);
}
这似乎只占99%的时间。另外1%的时间,进程A确定文件存在但进程B尚未编写所有内容(即缺少某些数据)。
是否有另一种更简单的方法可以使上述情况更加防弹?感谢。
答案 0 :(得分:3)
是否有另一种更简单的方法可以使上述情况更加防弹?
您可以使用Mutex
进行可靠的进程间同步。另一种可能性是使用FileSystemWatcher
。
答案 1 :(得分:3)
确定文件存在后,您可以尝试打开该文件以进行独占访问,如果另一个进程仍然打开该文件,该文件将失败:
try
{
File.Open("foo",FileMode.Open,FileAccess.Read,FileShare.None);
}
catch(IOException ex)
{
// go back to
}
答案 2 :(得分:1)
鉴于您说您可以更改两个进程的代码,您可以使用EventWaitHandle在进程之间进行通信。
在创建文件的程序中,在Main()方法中,您可以创建一个EventWaitHandle并将其保留到程序结束。您需要在程序中传递EventWaitHandle对象,以便创建该文件的代码可用(或提供文件创建代码可以调用的一些方法来设置事件)。
using (EventWaitHandle readySignaller = new EventWaitHandle(false, EventResetMode.ManualReset, "MySignalName"))
{
// Rest of program goes here...
// When your program creates the file, do this:
readySignaller.Set();
}
然后在等待文件的程序中有一些这样的代码:
// Returns true if the wait was successful.
// Once this has returned true, it will return false until the file is created again.
public static bool WaitForFileToBeCreated(int timeoutMilliseconds) // Pass Timeout.Infinite to wait infinitely.
{
using (EventWaitHandle readySignaller = new EventWaitHandle(false, EventResetMode.ManualReset, "MySignalName"))
{
bool result = readySignaller.WaitOne(timeoutMilliseconds);
if (result)
{
readySignaller.Reset();
}
return result;
}
}
注意:如果我们成功等待注意我正在重置信号,它将保持重置,直到另一个进程再次设置它。如果需要,您可以以不同方式处理逻辑;这只是一个例子。
基本上我们(逻辑上)在这里做的是在两个进程之间共享一个bool。您必须注意设置和重置共享bool的顺序。
答案 3 :(得分:0)
收听文件系统更改通知并在何时引发事件 目录或目录中的文件发生更改。