ファイルストリーム転送で停止と再起動の実装 - どうやって? c#.net
-
28-10-2019 - |
質問
ファイルストリーム転送で停止と再起動の実装に関するテキストやアドバイスを探しています。
目標は、アプリケーションが単一の読み取りソースを使用し、複数の書き込みソースに出力し、転送が失敗した場合に記録された位置から再起動できることです。
アプリケーションはC#.NETで記述されています。
psuedoコード:
while (reader.Read())
{
foreach(writer in writers)
{
writer.WriteToStream();
}
}
停止または一時停止を実装できる必要があります。そうするかもしれません。停止するには、続行がfalseとマークされます:
while (reader.Read() && Continue)
{
foreach(writer in writers)
{
writer.WriteToStream();
}
}
明らかに、この段階で、読み取られたバイト数と各書き込みソースに書き込まれるバイト数を記録する必要があります。
私の質問は次のとおりです。
読み取りバイトのみを記録し、これを再起動に使用する場合、1人以上の作家が書くことができたが、他の作家はそうではなかったかもしれません。読み取りの進行状況の尺度を使用して再起動するだけで、書かれたデータが破損する可能性があります。したがって、「ライターごとの書かれたバイト」レコードを新しいスタートポジションとして使用する必要があります。バイトが書かれていることを確認するにはどうすればよいですか(ファイルの長さを読み取るために、書き込みソースからファイルを読み取ることができないかもしれません)。
この種の問題に関するテキストの正しい方向に私をアドバイザーや指摘することはできますか?
解決
スレッド同期イベントを使用します。
(pseudocode):
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();
}
良いことは、作家のスレッドが一時停止したときにCPUを消費せず、直接続けないことです(フラグを使用して使用するのではなく、 Thread.Sleep()
)
もう1つのメモは、チェックは 最初 の議論 while
以来 reader.Read()
それ以外の場合は、ストリームから読み取ります(ただし、フラグがWhileブロックの実行を防ぐため、コンテンツは無視されます)。