2011-12-06 7 views
3

私はファイルストリーム転送での停止と再開を実装するためのテキストやアドバイスを探しています。ファイルストリーム転送での停止と再開の実装 - 方法C#.NET

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

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

擬コード:

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

私が停止または一時停止を実施できるようにする必要があります。そういうふうに動作します。停止するには、継続が偽マークされている:

この段階では明らかに
while (reader.Read() && Continue) 
{ 
    foreach(writer in writers) 
    { 
     writer.WriteToStream(); 
    } 
} 

私が読み込まれたバイトの数、および各書き込みソースに書き込まれたバイト数を記録する必要があります。

私の質問は以下のとおりです。

私は読み取り専用バイトを記録し、再起動のためにこれを使用した場合、他にはいないが、一つ以上の作家が書いたかもしれません。読み取り進行の指標を使用して再起動するだけで、書き込まれたデータが破損する可能性があります。だから私は新しいライターの位置として、ライターごとの書き込みバイトを使用する必要があります。バイトが書き込まれたことを確認するにはどうすればよいですか(ファイルの長さを読み取るために書き込み元からファイルを読み取る機能がない可能性があります)。

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

+0

もう1つの理由は、.NETには最初のクラスの継続が必要です。 – leppie

答えて

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(); 
} 

の良いところは、それが一時停止していたときにライタースレッドが任意のCPUを消費しないであろうと、それは(フラグとThread.Sleep()を使用するのとは反対に)それが合図だ直接続けるということです

他のノートは、さもなければストリームから読み込まれます(ただしコンテンツフラグので無視され、任意のチェックがreader.Read()ためwhile最初引数でなければならないということですwhileブロックが実行されないようにする)。

+0

したがって、_canReadEvent.Reset()を呼び出し、直後の行で書き込みの進行状況を読み取ると、完了した各ライターに依存できますか? – gb2d

+0

ハァッ?もっと詳しく教えてください。 – jgauffin

+0

申し訳ありませんが、あまり明確ではありません。私の更新を見てください。ありがとう – gb2d

関連する問題