2011-12-23 42 views
1

我有一個應用程序有很多線程處理數據。作爲此處理的一部分,它正在將一個小文件寫入網絡共享。我創建使用以下代碼的FileStream:C#創建FileStream到網絡共享多線程應用程序緩慢

using (var fileStream = new FileStream("\\server\path\etc", FileMode.Create, FileAccess.Write, FileShare.None)) 

在高負載下(下每秒100個文件寫入),因此FileStream的創建可能需要很長的時間(超過60秒)。這發生在應用程序在高負載下運行幾分鐘後。

創建FileStream時,必須有某些內容阻塞該線程。我想也許線程被阻止試圖創建一個連接到文件共享。我通過Process Explorer檢查了我的進程,但找不到到文件服務器的TCP連接。所以我猜測SMB連接到文件服務器不是通過TCP。

有沒有人有一個想法是什麼問題,或者我如何做不同的事情來實現更好的性能?

+0

您是否嘗試過在本地進行測試......以驗證您的邏輯中是否存在錯誤,或者它是否是真正的網絡問題 – MethodMan 2011-12-23 16:24:52

+0

好點。我應該在本地嘗試,看看它是否有相同的延遲。我只是假定它與寫入文件共享有關。 – Mas 2011-12-25 13:35:46

+0

我已經嘗試將路徑指向本地路徑,並且此性能問題不存在。奇怪的是,有時寫入文件共享工作正常。我懷疑由於這個文件共享是其他人也使用的服務器,所以這個問題可能只發生在其他用戶的服務器負載很大時。但是,這會導致FileStream創建非常慢嗎? – Mas 2012-01-02 12:35:37

回答

1

我懷疑您遇到此知識庫文章中描述的問題:Shared file access is delayed if the file is open on another computer。我個人認爲這導致Microsoft Access阻塞30秒,因爲它重試了30次,每次阻塞一秒。也許這是這個問題的延伸。

如果嘗試打開計算機上的文件,該文件在網絡上運行Windows NT 和文件是 具有共享限制其他客戶端計算機上打開,有一個約一秒鐘 之前的延遲將返回共享違規錯誤消息。如果客戶端 應用程序正在訪問服務器上的多個文件,則此延遲 可能會變得很重要。使用基於文件的多用戶應用程序(如具有共享數據庫文件的Jet數據庫引擎 )可以輕鬆地看到這些症狀。

我會先嚐試使用本地文件,然後看看會發生什麼。

+0

這些文件絕對不是共享的,因爲它們是用一個唯一的名字新創建的,寫入,然後關閉FileStream。但是,這是很好的信息要知道。 – Mas 2011-12-25 13:38:03