2

他のプロセス B によって生成されたデータを読み込むプロセス A があります。データはファイル システムを介して「交換」されます。ファイルが存在することを確認するために、プロセス A は現在、次のようにファイルの存在をチェックします。

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

これは 99% の確率でしか機能しないようです。残りの 1% の時間では、プロセス A はファイルが存在することを確立しますが、プロセス B はまだすべてを書き込んでいません (つまり、一部のデータが欠落しています)。

上記の状況をより防弾にする別の簡単な方法はありますか? ありがとう。

4

4 に答える 4

3

上記の状況をより防弾にする別の簡単な方法はありますか?

Mutex信頼性の高いプロセス間同期に使用できます。別の可能性は、を使用することFileSystemWatcherです。

于 2013-02-22T13:14:11.037 に答える
3

ファイルが存在することを確認したら、排他アクセス用にファイルを開こうとすることができます。これは、別のプロセスがまだファイルを開いている場合に失敗します。

try
{
   File.Open("foo",FileMode.Open,FileAccess.Read,FileShare.None);
}
catch(IOException ex)
{
   // go back to 
}
于 2013-02-22T13:15:54.280 に答える
1

両方のプロセスのコードを変更できると言うと、EventWaitHandleを使用してプロセス間で通信できます。

ファイルを作成するプログラムでは、Main()メソッドでEventWaitHandleを作成し、プログラムが終了するまでそれを保持できます。Programで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;
    }
}

注:正常に待機した場合は、信号をリセットしていることに注意してください。他のプロセスが信号を再度設定するまで、信号はリセットされたままになります。必要に応じて、ロジックを別の方法で処理できます。これは単なる例です。

基本的に、ここで(論理的に)行っているのは、2つのプロセス間でブール値を共有することです。その共有ブール値を設定およびリセットする順序に注意する必要があります。

于 2013-02-22T13:46:01.510 に答える
0

FileSystemWatcherを試してください。

ファイル システムの変更通知をリッスンし、ディレクトリまたはディレクトリ内のファイルが変更されたときにイベントを発生させます。

于 2013-02-22T13:16:27.507 に答える