2011-11-07 71 views
12

我在C#中創建windows應用程序,我想在多個文件中寫入多個線程。我從不同端口獲取數據,並且每個端口都有一個文件關聯。是否有可能爲每個端口創建線程並一次又一次地使用相同的線程來寫入數據到相應的文件? 假設我從端口10000,10001,10002獲取數據,並且有三個文件,分別爲10000.txt,10001.txt和10002.txt。我必須創建三個線程分別將數據寫入這三個文件,並且我想一次又一次地使用這些線程。是否有可能?如果可能,請給出一小段代碼示例?如何使用多個線程寫入單個文件?

+4

您需要序列化文件訪問(例如通過Mutex或類似的方法),或者讓一箇中心線程負責編寫文件,每個其他線程只是告訴要寫什麼(排隊要由該中心線程完成的工作)... – Yahia

+3

爲什麼你需要從多個線程寫入單個文件?這不是一個好主意,不僅僅來自同步,甚至寫入文件的機制(鎖等)。 – Oded

+0

在這裏,我從不同的端口連續獲取數據,並且有不同的文件。三個是與單個端口關聯的文件。我想將來自端口的數據寫入各個文件。我想爲每個傳入數據創建線程,它會將該數據寫入特定文件並中止它等等。 – Dany

回答

10

正如評論中所述,這是在尋求麻煩。

所以,你需要有一個線程安全類作家:

public class FileWriter 
{ 
    private ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim(); 
    public void WriteData(/*....whatever */) 
    { 
     lock_.EnterWriteLock(); 
     try 
     { 
      // write your data here 
     } 
     finally 
     { 
      lock_.ExitWriteLock(); 
     } 
    } 

} // eo class FileWriter 

本品適用於由多個線程調用。但是,有一個警告。可能會有鎖爭用。我使用了一個ReadWriterLockSlim類,因爲您可能想要讀取鎖以及地獄,該類也允許您從讀取狀態升級。

+0

感謝您的迴應,我寫了只有一種方法寫入文件,我只傳遞該方法的不同參數。但如果我使用LOCK寫入方法,那麼只有一個線程可以訪問該方法。這不是任何使用我。 – Dany

+0

@Dany,多個線程加1個文件=壞消息。你的用例是什麼? –

+0

多線程加+ 1文件不是我的情況。我的情況是多線程和多文件。 – Dany

0

您需要序列化線程並管理關閉和打開文件調用。可能使用append而不是寫入。您可以使用線程管理器類(更像主線程)來幫助同步所有其他線程。 雖然最好的東西可能是使用一個專用於寫入該文件的線程。

+0

感謝您的迴應,但我可以創建一個專用線程爲一個特定的文件和另一個線程爲另一個文件等? – Dany

+0

@Dany - 除非你有一個始終運行的線程,否則你的文件將被寫入同一個線程。即使是接受的答案也不會產生一個新的線程來寫入文件,只是防止多個線程同時寫入同一個文件。 –

3

您對其他帖子的回答與您的原始問題有些不符 - 您似乎想要爲每個帖子寫入一個不同的文件。

簡單的答案是..只要做到 - 文件系統是線程安全的。唯一的障礙可能是隻有一個磁盤的性能。同時並迅速地將很多小塊數據寫入多個文件可能會導致大量磁盤抖動,因爲文件系統試圖僅使用一個轉子臂來處理分佈式文件/目錄。具有大型緩存和智能控制器的現代硬盤可以在一定程度上緩解這種情況,但是您可能會遇到問題。試試看看!

如果您打算持續創建和銷燬線程,打開和關閉每個傳入網絡讀取的數據文件,則會增加您的問題。如果你可以避免這種情況,那就這樣做。

如果磁盤無法跟上,您可以實施自己的一些巧妙的「延遲寫入」算法,以增加磁盤寫入的大小,從而減少數量,或購買SSD或兩者。

相關問題