乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C#多線程寫日志

       kittywei 2015-06-17

      由于程序是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ù)庫(kù)!


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


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


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


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


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


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


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


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


       





      1. using System;  

      2. using System.Collections.Generic;  

      3. using System.Text;  

      4. namespace MTW  

      5. {  

      6.     public class MTWFile  

      7.     {  

      8.         private string _fileName;  

      9.         private static Dictionary<long, long> lockDic = new Dictionary<long, long>();  

      10.         /// <summary>  

      11.         /// 獲取或設(shè)置文件名稱  

      12.         /// </summary>  

      13.         public string FileName  

      14.         {  

      15.             get { return _fileName; }  

      16.             set { _fileName = value; }  

      17.         }  

      18.         /// <summary>  

      19.         /// 構(gòu)造函數(shù)  

      20.         /// </summary>  

      21.         /// <param name="byteCount">每次開辟位數(shù)大小,這個(gè)直接影響到記錄文件的效率</param>  

      22.         /// <param name="fileName">文件全路徑名</param>  

      23.         public MTWFile(string fileName)  

      24.         {  

      25.             _fileName = fileName;  

      26.         }  

      27.         /// <summary>  

      28.         /// 創(chuàng)建文件  

      29.         /// </summary>  

      30.         /// <param name="fileName"></param>  

      31.         public void Create(string fileName)  

      32.         {  

      33.             if (!System.IO.File.Exists(fileName))  

      34.             {  

      35.                 using (System.IO.FileStream fs = System.IO.File.Create(fileName))  

      36.                 {  

      37.                     fs.Close();  

      38.                 }  

      39.             }  

      40.         }  

      41.         /// <summary>  

      42.         /// 寫入文本  

      43.         /// </summary>  

      44.         /// <param name="content">文本內(nèi)容</param>  

      45.         private void Write(string content, string newLine)  

      46.         {  

      47.             if (string.IsNullOrEmpty(_fileName))  

      48.             {  

      49.                 throw new Exception("FileName不能為空!");  

      50.             }  

      51.             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))  

      52.             {  

      53.                 //Byte[] dataArray = System.Text.Encoding.ASCII.GetBytes(System.DateTime.Now.ToString() + content + "/r/n");  

      54.                 Byte[] dataArray = System.Text.Encoding.Default.GetBytes(content + newLine);  

      55.                 bool flag = true;  

      56.                 long slen = dataArray.Length;  

      57.                 long len = 0;  

      58.                 while (flag)  

      59.                 {  

      60.                     try  

      61.                     {  

      62.                         if (len >= fs.Length)  

      63.                         {  

      64.                             fs.Lock(len, slen);  

      65.                             lockDic[len] = slen;  

      66.                             flag = false;  

      67.                         }  

      68.                         else  

      69.                         {  

      70.                             len = fs.Length;  

      71.                         }  

      72.                     }  

      73.                     catch (Exception ex)  

      74.                     {  

      75.                         while (!lockDic.ContainsKey(len))  

      76.                         {  

      77.                             len += lockDic[len];  

      78.                         }  

      79.                     }  

      80.                 }  

      81.                 fs.Seek(len, System.IO.SeekOrigin.Begin);  

      82.                 fs.Write(dataArray, 0, dataArray.Length);  

      83.                 fs.Close();  

      84.             }  

      85.         }  

      86.         /// <summary>  

      87.         /// 寫入文件內(nèi)容  

      88.         /// </summary>  

      89.         /// <param name="content"></param>  

      90.         public void WriteLine(string content)  

      91.         {  

      92.             this.Write(content, System.Environment.NewLine);  

      93.         }  

      94.         /// <summary>  

      95.         /// 寫入文件  

      96.         /// </summary>  

      97.         /// <param name="content"></param>  

      98.         public void Write(string content)  

      99.         {  

      100.             this.Write(content, "");  

      101.         }  

      102.     }  

      103. }  


       


       


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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多