NET问答: 如何实现读写 file 的时候不用锁模式 ?
生活随笔
收集整理的這篇文章主要介紹了
NET问答: 如何实现读写 file 的时候不用锁模式 ?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
Homam:
我先說一下我的顧慮,是這樣的,我有一個 windows service 服務在不斷的寫入日志,同時我還有個看板程序在不斷的獲取 windows service 程序寫入的日志。
問題是:service 程序在寫日志的時候會 lock 文件,看板程序在讀取的時候也會 lock 文件,這就很尷尬了,經常遇到進程被占用的異常。
服務程序代碼:
void?WriteInLog(string?logFilePath,?data) {File.AppendAllText(logFilePath,?string.Format("{0}?:?{1}\r\n",?DateTime.Now,?data)); }看板程序代碼:
int?index?=?0;private?void?Form1_Load(object?sender,?EventArgs?e){try{using?(StreamReader?sr?=?new?StreamReader(logFilePath)){while?(sr.Peek()?>=?0)??//?reading?the?old?data{AddLineToGrid(sr.ReadLine());index++;}sr.Close();}timer1.Start();}catch?(Exception?ex){MessageBox.Show(ex.Message);}}private?void?timer1_Tick(object?sender,?EventArgs?e){using?(StreamReader?sr?=?new?StreamReader(logFilePath)){//?skipping?the?old?data,?it?has?read?in?the?Form1_Load?event?handlerfor?(int?i?=?0;?i?<?index?;?i++)?sr.ReadLine();while?(sr.Peek()?>=?0)?//?reading?the?live?data?if?exists{string?str?=?sr.ReadLine();if?(str?!=?null){AddLineToGrid(str);index++;}}sr.Close();}}請問大家我該如何解決此問題?
回答區
Manfred:
你的問題在于寫入和讀取都是以排他的方式進行,其實 FileStream 中是可以支持共享的方式進行讀寫的。
比如將 service 代碼改造如下:
var?outStream?=?new?FileStream(logfileName,?FileMode.Open,?FileAccess.Write,?FileShare.ReadWrite);看板程序改造如下:
var?inStream?=?new?FileStream(logfileName,?FileMode.Open,?FileAccess.Read,?FileShare.ReadWrite);用完的時候記得 Close 一下,對了, FileStream 實現了 IDisposable 接口,可以用 using 包一下,參考如下代碼:
using(var?outStream?=?...) {//?using?outStream?here... }點評區
????,我特意看了下 FileStream 的 FileShare.ReadWrite 參數解釋。
????[ComVisible(true)][Flags]public?enum?FileShare{None?=?0,Read?=?1,Write?=?2,////?Summary://?????Allows?subsequent?opening?of?the?file?for?reading?or?writing.?If?this?flag?is//?????not?specified,?any?request?to?open?the?file?for?reading?or?writing?(by?this?process//?????or?another?process)?will?fail?until?the?file?is?closed.?However,?even?if?this//?????flag?is?specified,?additional?permissions?might?still?be?needed?to?access?the//?????file.ReadWrite?=?3,Delete?=?4,Inheritable?=?16}我去,原來還可以這樣玩,對 FileStream 用的還不透徹,學習了。
總結
以上是生活随笔為你收集整理的NET问答: 如何实现读写 file 的时候不用锁模式 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win 11 真的要来了!微软宣布 Wi
- 下一篇: C sharp实例:华盾武器门数据接收和