2011-12-06 43 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

.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()

另外需要注意的是,任何檢查應在while因爲reader.Read()從否則流將讀取第一參數(但因爲標誌的內容將被忽略會防止while塊被執行)。

+0

因此,如果我調用_canReadEvent.Reset(),然後立即讀取該行中的寫入進度,我可以依靠每位作者完成? – gb2d

+0

呵呵?請詳細說明。 – jgauffin

+0

對不起,不是很清楚。請參閱我的更新。謝謝 – gb2d