以前一篇隨筆(使用 SharpSvn 執行 svn 操做)講到能夠經過聲稱一個綁定到一個 SvnClient 對象的 SvnClientReport 對象。爲了說明方便,將對應的程序片斷再次寫在下面,html
using (SvnClient client = new SvnClient()) { StringBuilder strBuilder = new StringBuilder(); SvnClientReporter reporter = new SvnClientReporter(client, strBuilder); }
該程序片斷使用一個 StringBuilder 對象來聲稱 SvnClientReport 對象。這樣子,咱們只能等到執行 svn 操做以後才能從 StringBuilder 對象中獲取全部操做日誌。若是執行的 svn 操做比較耗時(例如 commit 上千個文件),咱們不可以實時地獲取 SharpSvn 執行 svn 操做的日誌,咱們會覺得程序卡住了。那麼,如何實時獲取 SharpSvn 操做的日誌?ide
首先, 獲取 SharpSvn 執行 svn 操做日誌只能經過聲明 SvnClientReport 對象。這是咱們的出現點,那麼怎樣聲明一個實時獲取操做日誌的 SvnClientReport 對象?先看一下 SvnClientReport 類的構造函數(參考http://docs.sharpsvn.net/current/),svn
SvnClientReporter(SvnClient, TextWriter);函數
SvnClientReporter(SvnClient, StringBuilder);ui
SvnClientReporter(SvnClientArgs, TextWriter);spa
SvnClientReporter(SvnClientArgs, StringBuilder);.net
SvnClientReporter(SvnClient, StringBuilder, IFormatProvider);日誌
SvnClientReporter(SvnClientArgs, StringBuilder, IFormatProvider);code
經過 SvnClientReport 類的構造函數,咱們能夠看出咱們只能使用一個 StringBuilder 或者 TextWriter 對象來聲明一個 SvnClientReport 對象。上一節咱們已經看到經過 StringBuilder 對象是沒法實時獲取 SharpSvn 操做日誌的了,那咱們只能從 TextWriter 下手了。orm
經過http://msdn.microsoft.com/zh-cn/library/ywxh2328%28VS.80%29.aspx,咱們看到 TextWriter 是一個抽象類,那麼咱們是否是就能夠經過定義一個TextWriter 派生類來實現咱們實時獲取 SharpSvn 操做日誌呢?!
下面實現的 MyRealTimeTextWriter 類繼承了抽象類 TextWriter,實現了屬性 Encoding(必須實現),而且覆蓋實現了 void Write(string) 和void WriteLine(string value) 兩個方法,這兩個方法經過觸發 DataReceived事件告知外界其接收到的數據。
class MyRealTimeTextWriter : TextWriter { //TextWriter派生類必須實現 public Encoding Encoding { get { return Encoding.UTF8; } } //接收到數據,就觸發該事件 public event Action<string> DataReceived; private void OnDataReceived(string value) { if (DataReceived != null) { DataReceived(value); } } public override void Write(string value) { OnDataReceived(value); } public override void WriteLine(string value) { OnDataReceived(value); } }
有了 MyRealTimeTextWriter 類以後,咱們就可實現下面的程序來實時獲取 SharpSvn 操做的日誌。
using (SvnClient client = new SvnClient()) { MyRealTimeTextWriter realtimeTextWriter = new MyRealTimeTextWriter(); realtimeTextWriter.DataReceived += new Action<string>( delegate (string value) { /* do on the sharpsvn operation logs */ }); SvnClientReporter reporter = new SvnClientReporter(client, realtimeTextWriter); /* do svn operations */ }
上面程序經過一個 MyRealTimeTextWriter 對象來生成 SvnClientReport 對象。每當 SharpSvn 操做產生一條日誌信息時就會調用 MyRealTimeTextWriter 對象的 Write(string) 或 WriteLine(string) 方法,而這兩個方法當即觸發 DataReceived 事件告知外面有日誌生成了,因而便達到了實時獲取 SharpSvn 操做日誌的目的。
(done)