C# 一个进程等待另一个进程';s通过文件系统输出

C# 一个进程等待另一个进程';s通过文件系统输出,c#,c#-4.0,C#,C# 4.0,我有一个进程a,它读取其他进程B生成的一些数据。这些数据通过文件系统“交换”。要确保文件存在,进程A当前会检查文件是否存在,如下所示: while (!File.Exists(FileLocation)) { Thread.Sleep(100); } 这似乎只有99%的时间有效。另外1%的时间,进程A确定文件存在,但进程B尚未写入所有内容(即,某些数据丢失) 有没有其他更简单的方法使上述情况更加防弹?谢谢 有没有其他更简单的方法使上述情况更加防弹 您可以使用用于可靠进程间同步的。另一

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

while (!File.Exists(FileLocation))
{
    Thread.Sleep(100);
} 
这似乎只有99%的时间有效。另外1%的时间,进程A确定文件存在,但进程B尚未写入所有内容(即,某些数据丢失)

有没有其他更简单的方法使上述情况更加防弹?谢谢

有没有其他更简单的方法使上述情况更加防弹


您可以使用用于可靠进程间同步的。另一种可能性是使用。

在确定文件存在后,您可以尝试以独占方式打开该文件,如果另一个进程仍然打开该文件,则该操作将失败:

try
{
   File.Open("foo",FileMode.Open,FileAccess.Read,FileShare.None);
}
catch(IOException ex)
{
   // go back to 
}
试试这个

侦听文件系统更改通知,并在 目录或目录中的文件发生更改


假设您说您可以更改两个进程的代码,那么您可以使用EventWaitHandle在进程之间进行通信

在创建文件的程序中,可以在Main()方法中创建EventWaitHandle,并将其保留到程序结束。您需要在程序中传递EventWaitHandle对象,以便创建文件的代码位可以使用它(或者提供一些方法,文件创建代码可以调用这些方法来设置事件)

然后在等待文件的程序中有如下代码:

// 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的顺序。

不太可能,尽管您应该使用FileSystemWatcher()——但除了删除轮询之外,这对解决问题没有任何帮助。您必须等待,直到文件的大小没有更改(在此处插入适当的秒数)。Hacky Hacky.你看过FileSystemWatcher吗?谢谢,我正在研究FileSystemWatcher,但我认为它在我的情况下不起作用。你能更改另一个进程的代码吗?还是不可能?我可以管理两个进程的代码。是的,这就是解决方案。每次失败时,请等待一秒钟,然后重试。最终,另一个进程将关闭该文件,这将成功,您就可以开始了。这是不可靠的,但除非你能改变另一个过程来使用适当的信号,否则这是你可能能做到的最好的方法。当然这并不理想,但如果你不控制“生产者”方面,我不确定你有多少选择。如果您确实控制了生产者端,您可以生成第二个文件(“foo.lock”),该文件将在写入完成后消失,您可以检查这两个文件。注意:OP的最新响应表明他可以更改这两个进程的代码;有了这些信息,就有了更好的解决方案。如果不能更改其他进程,您的想法是最好的。它在我的情况下不起作用,因为当我停止顺序执行以等待文件完全写入时,我无法捕获事件。。。除非我错过了什么。
// 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;
    }
}