2016-08-23 22 views
0

我有一個quartz.net預定作業。每次運行時,我需要更新文本文件上次運行的日期時間。這個文件將只有一行,即。工作上次運行的日期。編寫這一行文本文件線程安全的最佳方法是什麼?c#如何使用當前日期時間更新文本文件,每次我的石英作業運行

我會哄下面的代碼:

private static object locker = new Object(); 

public void WriteToFile(StringBuilder text) 
{ 
    lock (locker) 
    { 
     using (FileStream file = new FileStream(Filepath, FileMode.Append, FileAccess.Write, FileShare.Read)) 
     using (StreamWriter writer = new StreamWriter(file, Encoding.Unicode)) 
     { 
      writer.Write(text.ToString()); 
     } 
    } 

} 

感謝

回答

1

這裏最好的方法是使用一個隊列;將不會有衝突的機會。 例如,您可以使用BlockingCollection(檢查this)。

首先,你需要附加一個JobListner得到通知每一個作業完成時間:

public class MyJobListener : JobListenerSupport 
{ 

    BlockingQueue<DateTime> _queue; 

    public override string Name 
    { 
     get { return "AllJobListener"; } 
    } 

    public override void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException) 
    { 
     if (jobException == null) 
     { 
      // do whatever you want 
     } 
     else 
     { 
      _queue.Add(DateTime.UtcNow); 
     } 

     base.JobWasExecuted(context, jobException); 
    } 
} 

其中_queue是實例的BlockingQueue<DateTime>(你可以注入,或定義指向一個靜態隊列某處其他服務)。

然後,你需要一個簡單的定時器(太服務定義)是這樣的:

 Timer t = new Timer(callback => 
     { 
      foreach (var msg in _queue.GetConsumingEnumerable()) 
      { 
       File.AppendAllText(msg.Filepath, msg.Text); 
      } 
     }, null, 0, (long)TimeSpan.FromSeconds(1).TotalMilliseconds); 

顯然,你需要使用基於權期上你的需要,這僅僅是一個例子。

我建議你查看這個答案,以獲取更多關於how to write thead-safe的詳細信息。

相關問題