3

ファイルストリーム転送での停止と再起動の実装に関するテキストまたはアドバイスを探しています。

目標は、アプリケーションが単一の読み取りソースを使用し、複数の書き込みソースに出力し、転送が失敗した場合に記録された位置から再開できるようにすることです。

アプリケーションはC#.NETで作成されています。

疑似コード:

while (reader.Read())
{
    foreach(writer in writers)
    {
        writer.WriteToStream();
    }
}

停止または一時停止を実装できる必要があります。これはそのように機能する可能性があります。停止するには、続行はfalseとマークされます。

while (reader.Read() && Continue)
{
    foreach(writer in writers)
    {
        writer.WriteToStream();
    }
}

明らかに、この段階で、読み取られたバイト数と、各書き込みソースに書き込まれたバイト数を記録する必要があります。

私の質問は次のとおりです。

読み取りバイトのみを記録し、これを再起動に使用する場合、1人以上のライターが書き込みを行った可能性がありますが、他のライターは書き込みを行いませんでした。読み取りの進行状況を測定して再起動するだけで、書き込まれたデータが破損する可能性があります。したがって、新しい開始位置として「ライターごとに書き込まれたバイト数」レコードを使用する必要があります。バイトが書き込まれたことを確認するにはどうすればよいですか(書き込みソースからファイルを読み取ってファイルの長さを読み取ることができない場合があります)。

誰かがこの種の問題に関するテキストの正しい方向に私を助言したり指摘したりできますか?

4

1 に答える 1

2

スレッド同期イベントを使用します。

(擬似コード):

ManualResetEvent _canReadEvent = new ManualResetEvent(true);

public void WriterThreadFunc()
{
    while (_canReadEvent.Wait() && reader.Read())
    {
        foreach(writer in writers)
        {
            writer.WriteToStream();
        }
    }
}

public void Pause()
{
    _canReadEvent.Reset();
}

public void Continue()
{
    _canReadEvent.Set();
}

Thread.Sleep()良い点は、ライタースレッドが一時停止したときにCPUを消費せず、(フラグとを使用するのではなく)シグナルを直接継続することです。

もう1つの注意点は、チェックはストリームから読み取られるため、最初引数にする必要があるということです(ただし、フラグによってwhileブロックの実行が妨げられるため、コンテンツは無視されます)。whilereader.Read()

于 2011-12-06T11:11:32.240 に答える