2011-09-27 82 views
2

我有一個關於多線程運行,需要將結果保存到同一個文本文件如何寫在多線程環境中文件

我收到訪問衝突錯誤

我怎樣才能避免做一個節目,但所有的人這

+0

您沒有收到訪問衝突錯誤,那會很糟糕。你可能有一個UnauthorizedAccessException。只打開一次文件,並使用鎖定來防止輸出混合。 –

回答

3

裹文件IO爲lock statement

private static object _syncRoot = new object(); 

然後:

lock(_syncRoot) 
{ 
    // do whatever you have to do with this file 
} 
+0

相當有用,感謝和關注 –

+0

即使它解決了我的目的..謝謝噸 –

0

我會建議在ReaderWriterLock類或ReaderWriterLockSlim類,這是快,但有一些陷阱讀書了,我相信它會滿足您的需求完美。

ReaderWriterLock
ReaderWriterLockSlim

+0

這是錯誤的;這裏的所有線程都是編寫者。讀取器/寫入器鎖只有在讀取數量大大超過寫入時纔會受益。在這種情況下,所有訪問都需要寫入(如此排除)。這只是***增加了開銷。香草鎖(監視器)將是更可取的。 –

+0

我很難說這些方法中的任何一種都是「錯誤的」。是的,顯示器確實在只寫情況下提供了更好的性能,但在只會感覺到非常高的爭用情況的水平上。 – Gent

+0

如果所有訪問都是「寫入」,那麼確定它仍然會*工作*,但它使用了錯誤的工具 –

1

最簡單的是簡單地確保您有一定的鎖定結構(互斥體,監控等),對訪問該文件,則每個線程都可以單獨訪問。這可以訪問相同的基礎Stream/TextWriter/etc,或者可以打開/關閉鎖定區域內的文件。

更復雜的方法是擁有專用的寫入器線程和同步的工作隊列。然後,所有線程都可以添加到隊列中,並且一個線程可以草稿並寫入文件。這意味着您的主線程僅在添加隊列(非常簡短)時才被阻止,而不是在IO(較慢)上阻塞。但是請注意,如果進程異常退出,隊列中的數據可能會丟失。