一个进程通过文件系统等待另一个进程的输出

时间:2013-02-22 13:11:31

标签: c# c#-4.0

我有一个进程A读取其他进程B生成的一些数据。数据通过文件系统“交换”。为确保文件存在,进程A当前检查文件是否存在,如下所示:

while (!File.Exists(FileLocation))
{
    Thread.Sleep(100);
} 

这似乎只占99%的时间。另外1%的时间,进程A确定文件存在但进程B尚未编写所有内容(即缺少某些数据)。

是否有另一种更简单的方法可以使上述情况更加防弹?感谢。

4 个答案:

答案 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)

尝试FileSystemWatcher

  

收听文件系统更改通知并在何时引发事件   目录或目录中的文件发生更改。