<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      基礎才是重中之重~關于ThreadStatic和Quartz的一點淵源

      回到目錄

      ThreadStatic

      ThreadStatic是C#里的一個特性,它可以讓你的字段在一個線程里有效,但你不能控制這個字段在何時被回收,即如果聲明一個int32的字段為ThreadStatic,然后你為它賦值時為100,那么它什么被恢復成默認值0,我們不得而知,這在開發時,我們可能只有手動將它設為0才行,比較難看,但也沒辦法,誰讓咱們用了ThreadStatic呢,被聲明為ThreadStatic之后,已經證明這個字段是靜態化的,只不過它是被局限在一個線程內的。

      Quartz

      Quartz是一個任務調度框架,起源于java,它目前被廣泛的使用在各種后臺處理數據的場合,像一些統計數據,推送數據,消息數據等,它可以大大降低前端服務器的并發壓力,并且Quartz的管理界面也有很多,直接nuget安裝即可,在這些產品中最知名的應該就是CrystalQuartz了,它可以在WEB界面中管理咱們的JOB項目!

      日志系統Lind.DDD.Logger

      Logger本來是Lind框架的一個日志組件,它是最低層的組件,是其它組件的基礎,也被用到其它的業務系統里,而其中一個Quartz組件里,使用Logger時提出了一個問題,就是如何根據job去自動建立日志目錄,讓每個JOB都有自己的目錄,這樣在分析日志時還是很有必要的。

      希望看到的結果如圖

      測試用的兩個Job

         public class Hello_Job : JobBase
          {
      
              protected override void ExcuteJob()
              {
      
                  Console.WriteLine("Hello Job方法:" + Thread.CurrentThread.ManagedThreadId);
                  Lind.DDD.Logger.LoggerFactory.Instance.Logger_Info("Hello Job日志!");
              }
          }
      
          public class Hi_Job : Lind.DDD.QuartzJob.JobBase
          {
      
              protected override void ExcuteJob()
              {
      
                  Console.WriteLine("Hi Job!" + Thread.CurrentThread.ManagedThreadId);
                  Lind.DDD.Logger.LoggerFactory.Instance.Logger_Info("Hi Job!");
      
              }
          }

      JobBase做于所有Job的基類存在,它主要有自己的抽象方法和IJob的接口方法,其中抽象方法由字類Job自己去實現,去實現自己的業務邏輯;而IJob方法由Quartz框架去調用,并在方法中自己調用了抽象方法的內容,大致代碼如下

          [DisallowConcurrentExecution()]
          public abstract class JobBase : IJob
          {
      
              #region IJob 成員
              /// <summary>
              /// Job主方法
              /// </summary>
              /// <param name="context"></param>
              public void Execute(IJobExecutionContext context)
              {
                  Lind.DDD.Logger.LoggerFactory.Instance.SetPath(this.GetType().Name);
                  ExcuteJob();
                  Console.WriteLine(DateTime.Now.ToString() + "{0}這個Job開始執行", context.JobDetail.Key.Name);
              }
      
              #endregion
      
              /// <summary>
              /// Job具體類去實現自己的邏輯
              /// </summary>
              protected abstract void ExcuteJob();
          }

      日志組件中的字段使用了ThreadStatic

      對日志文件分文件夾存儲,主要在日志組件中使用ThreadStatic來實現的,代碼主要如下

              /// <summary>
              /// 每個子類初始時都執行基類這個構造,初始化當前路徑
              /// </summary>
              public LoggerBase()
              {
                  FileUrl = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LoggerDir");
              }
              /// <summary>
              /// 日志文件地址
              /// 優化級為mvc方案地址,網站方案地址,console程序地址
              /// </summary>
              [ThreadStatic]
              static protected string FileUrl;
             #region ILogger 成員
              public void SetPath(string path)
              {
                  if (!string.IsNullOrWhiteSpace(path))
                  {
                      FileUrl = FileUrl + "\\" + path;
                  }
              }
              #endregion

      對于FileLogger這個文件日志實現類來說,它要做的是,在寫完文件流之后,要把FileUrl這個字段從新賦值,因為我們不知道這個字符串什么時候被清空!

                 lock (objLock)//防治多線程讀寫沖突
                  {
                      using (System.IO.StreamWriter srFile = new System.IO.StreamWriter(filePath, true))
                      {
                          srFile.WriteLine(string.Format("{0}{1}{2}"
                              , DateTime.Now.ToString().PadRight(20)
                              , ("[ThreadID:" + Thread.CurrentThread.ManagedThreadId.ToString() + "]").PadRight(14)
                              , message));
                          srFile.Close();
                          srFile.Dispose();
                      }
                  }
                  //清除當前的路徑
                  FileUrl = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LoggerDir");

      上面的問題,我也是找了很久,因為總是找不到測試不成功的原因,最后想到了ThreadStatic特性的聲明周期,算是找到根源了,呵呵!

      建議大家看看C#的《對象的生與死》!

      回到目錄

      posted @ 2017-04-27 10:19  張占嶺  閱讀(960)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 欧美成人影院亚洲综合图| 国产精品一区二区黄色片| 亚洲一卡2卡3卡4卡精品| 久久av色欲av久久蜜桃网| 国产成A人片在线观看视频下载| 久青草精品视频在线观看| 漂亮人妻被修理工侵犯| 蜜臀午夜一区二区在线播放 | 白嫩少妇激情无码| 日韩一区二区大尺度在线| 铜山县| 欧洲美熟女乱av在免费| 亚洲精品日本一区二区| 国产成AV人片久青草影院| 日韩精品一区二区三区无| 美女禁区a级全片免费观看| 亚洲精品日韩精品久久| 狠狠色噜噜狠狠狠狠2021| 精品一区二区成人精品| 精品午夜福利在线视在亚洲| 日韩一区二区三区三级| 1024你懂的国产精品| 顶级欧美熟妇xx| 综合人妻久久一区二区精品| 久久人与动人物a级毛片| 日本高清一区免费中文视频| 夜夜爽77777妓女免费看| 99久久久国产精品免费无卡顿| 丰满熟妇人妻中文字幕| 国产国产久热这里只有精品| 国产精品 欧美 亚洲 制服| 日韩69永久免费视频| 成av人片一区二区久久| 青青草国产线观看| 欧美野外伦姧在线观看| 97久久精品亚洲中文字幕无码| 92精品国产自产在线观看481页| 国产福利酱国产一区二区| 亚洲男人AV天堂午夜在| 国产欧美亚洲精品a第一页| 永久免费无码国产|