簡體   English   中英

C# - 安全多線程保存文件訪問

[英]C# — Safe Multiple Thread Save File Access

我目前正在開發一個使用兩個獨立線程C#應用程序 ,第一個是程序操作的主線程 ,第二個是日志線程 日志線程基本上是一個每隔一秒左右運行循環,並且僅在應用程序關閉時才會中斷。

基本上,每隔一秒左右,如果有要輸出的消息,日志線程會寫入日志文件(文本文件)。 我的問題是,在主線程上我有一個移動功能,它可以改變日志文件(和其他文件)的路徑,並將舊文件移動到新位置。 我的問題是,如果日志線程寫入日志文件並且移動函數嘗試移動文件,反之亦然,會發生什么? 我將如何幫助防止這種情況發生?

如果我不更改保存路徑,程序運行正常,但我擔心如果主線程和日志線程都試圖同時對日志文件執行某些操作,則主線程和日志線程可能會死鎖。 我已經對此做了一些研究,但我能想到的是同時阻止多個線程讀/寫文件的方法,而不是移動文件並像我一樣寫入文件。 那么,是否有某種方式,日志線程可以告訴主線程它正在使用日志文件,主線程可以在完成時使用日志文件,反之亦然?

多線程是我一直想嘗試的東西,但總是被這樣的事情的復雜性所拖延。 它當然需要更多的邏輯來阻止事情出錯。

幫助將不勝感激,因為這是應用程序需要的最后一件事,以防止大量錯誤(至少我可以告訴,這是真正的測試)。

編輯:我真正想要的是兩個線程可以“通信”以告知對方何時訪問日志文件,以便他們不會同時嘗試訪問同一文件。

每當主線程需要復制文件時,我就會一起殺死你的日志線程,然后再啟動一個新的日志線程。

你的問題指導方向錯誤,如果你解釋你的最終目標是什么,你可能會得到更好的答案。

通常情況不同。 多個線程登錄到內存緩沖區。 每個線程都有自己的緩沖區,因此沒有緩沖區爭用。 當線程的緩沖區已滿時,將創建一個新緩沖區並與完整緩沖區交換。 記錄繼續到新緩沖區,而舊緩沖區被發送到一個線程,其目的只是將緩沖區寫入文件並旋轉日志文件。 這允許多個線程非常快速地登錄內存。 由於它只是一個實際與文件交互的線程,因此文件移動操作沒有沖突。

關於你的問題,假設文件移動不經常發生,你可以使用纖薄的多個讀取器,單個寫入器鎖定https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim%28v=vs.110 %29.aspx實現這一點(如果你有多個線程記錄而只有一個移動文件),否則如果你只有兩個線程,普通鎖(obj)語句就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM