日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#多线程写日志

發(fā)布時(shí)間:2023/11/29 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#多线程写日志 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于程序是3層架構(gòu)的,所有多線程記錄日志成了比較棘手的問題,以前還真就沒有在意過寫日志的問題,認(rèn)為不過是寫文件罷了~~!如今發(fā)現(xiàn)原來要實(shí)現(xiàn)文件共享,并且能夠使多線程同時(shí)操作日志還不能相互沖突,真的很麻煩。當(dāng)然要實(shí)現(xiàn)它我首先想到的是在網(wǎng)上搜,結(jié)果可能是我搜的不得其法,沒發(fā)現(xiàn)結(jié)果,多數(shù)都是用lock,mutx等線程鎖或互斥的方式寫日志,偶想這樣和單線程有啥區(qū)別嗎?還是沒能起到多線程應(yīng)該有的效率!

后來問朋友,發(fā)現(xiàn)個(gè)log4net的東西,不過此物依然用到了線程互斥,看了源碼發(fā)現(xiàn)的!

網(wǎng)絡(luò)不行,朋友不知道,只好自己想辦法。想了幾種方法如下:

1、寫多個(gè)文件,然后找個(gè)機(jī)會(huì)把這些文件合并!

2、干脆放棄寫文件,改寫數(shù)據(jù)庫!

3、把文件看成一個(gè)表結(jié)構(gòu),實(shí)現(xiàn)行級(jí)鎖。也就是一個(gè)線程寫一行。

4、把文件看成內(nèi)存塊,每塊寫完再合并!

以上幾種方法缺點(diǎn):

1、多個(gè)文件。。。想起來就惡心!

2、寫數(shù)據(jù)庫?太沒技術(shù)含量咱不干!

3、行級(jí)鎖?我一個(gè)線程要寫入多行不是看起來很亂?

4、沒想到啥缺點(diǎn),實(shí)現(xiàn)它吧!

以下是偶經(jīng)過了10000線程并發(fā)測(cè)試,也沒發(fā)現(xiàn)問題的代碼!

?

[c-sharp]?view plaincopyprint?
  • using?System;??
  • using?System.Collections.Generic;??
  • using?System.Text;??
  • namespace?MTW??
  • {??
  • ????public?class?MTWFile??
  • ????{??
  • ????????private?string?_fileName;??
  • ????????private?static?Dictionary<long,?long>?lockDic?=?new?Dictionary<long,?long>();??
  • ????????///?<summary>??
  • ????????///?獲取或設(shè)置文件名稱??
  • ????????///?</summary>??
  • ????????public?string?FileName??
  • ????????{??
  • ????????????get?{?return?_fileName;?}??
  • ????????????set?{?_fileName?=?value;?}??
  • ????????}??
  • ????????///?<summary>??
  • ????????///?構(gòu)造函數(shù)??
  • ????????///?</summary>??
  • ????????///?<param?name="byteCount">每次開辟位數(shù)大小,這個(gè)直接影響到記錄文件的效率</param>??
  • ????????///?<param?name="fileName">文件全路徑名</param>??
  • ????????public?MTWFile(string?fileName)??
  • ????????{??
  • ????????????_fileName?=?fileName;??
  • ????????}??
  • ????????///?<summary>??
  • ????????///?創(chuàng)建文件??
  • ????????///?</summary>??
  • ????????///?<param?name="fileName"></param>??
  • ????????public?void?Create(string?fileName)??
  • ????????{??
  • ????????????if?(!System.IO.File.Exists(fileName))??
  • ????????????{??
  • ????????????????using?(System.IO.FileStream?fs?=?System.IO.File.Create(fileName))??
  • ????????????????{??
  • ????????????????????fs.Close();??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????///?<summary>??
  • ????????///?寫入文本??
  • ????????///?</summary>??
  • ????????///?<param?name="content">文本內(nèi)容</param>??
  • ????????private?void?Write(string?content,?string?newLine)??
  • ????????{??
  • ????????????if?(string.IsNullOrEmpty(_fileName))??
  • ????????????{??
  • ????????????????throw?new?Exception("FileName不能為空!");??
  • ????????????}??
  • ????????????using?(System.IO.FileStream?fs?=?new?System.IO.FileStream(_fileName,?System.IO.FileMode.OpenOrCreate,?System.IO.FileAccess.ReadWrite,?System.IO.FileShare.ReadWrite,?8,?System.IO.FileOptions.Asynchronous))??
  • ????????????{??
  • ????????????????//Byte[]?dataArray?=?System.Text.Encoding.ASCII.GetBytes(System.DateTime.Now.ToString()?+?content?+?"/r/n");??
  • ????????????????Byte[]?dataArray?=?System.Text.Encoding.Default.GetBytes(content?+?newLine);??
  • ????????????????bool?flag?=?true;??
  • ????????????????long?slen?=?dataArray.Length;??
  • ????????????????long?len?=?0;??
  • ????????????????while?(flag)??
  • ????????????????{??
  • ????????????????????try??
  • ????????????????????{??
  • ????????????????????????if?(len?>=?fs.Length)??
  • ????????????????????????{??
  • ????????????????????????????fs.Lock(len,?slen);??
  • ????????????????????????????lockDic[len]?=?slen;??
  • ????????????????????????????flag?=?false;??
  • ????????????????????????}??
  • ????????????????????????else??
  • ????????????????????????{??
  • ????????????????????????????len?=?fs.Length;??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????????catch?(Exception?ex)??
  • ????????????????????{??
  • ????????????????????????while?(!lockDic.ContainsKey(len))??
  • ????????????????????????{??
  • ????????????????????????????len?+=?lockDic[len];??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????????fs.Seek(len,?System.IO.SeekOrigin.Begin);??
  • ????????????????fs.Write(dataArray,?0,?dataArray.Length);??
  • ????????????????fs.Close();??
  • ????????????}??
  • ????????}??
  • ????????///?<summary>??
  • ????????///?寫入文件內(nèi)容??
  • ????????///?</summary>??
  • ????????///?<param?name="content"></param>??
  • ????????public?void?WriteLine(string?content)??
  • ????????{??
  • ????????????this.Write(content,?System.Environment.NewLine);??
  • ????????}??
  • ????????///?<summary>??
  • ????????///?寫入文件??
  • ????????///?</summary>??
  • ????????///?<param?name="content"></param>??
  • ????????public?void?Write(string?content)??
  • ????????{??
  • ????????????this.Write(content,?"");??
  • ????????}??
  • ????}??
  • }??
  • ?

    ?

    調(diào)用起來很簡(jiǎn)單,實(shí)例化,然后隨便調(diào)用一個(gè)write或writeLine方法!

    總結(jié)

    以上是生活随笔為你收集整理的C#多线程写日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。