之前一篇隨筆(使用 SharpSvn 執行 svn 操作)講到可以通過聲稱一個綁定到一個 SvnClient 對象的 SvnClientReport 對象。為了說明方便,將對應的程序片段再次寫在下面,
using (SvnClient client = new SvnClient()){ StringBuilder strBuilder = new StringBuilder(); SvnClientReporter reporter = new SvnClientReporter(client, strBuilder);}
該程序片段使用一個 StringBuilder 對象來聲稱 SvnClientReport 對象。這樣子,我們只能等到執行 svn 操作之后才能從 StringBuilder 對象中獲取所有操作日志。如果執行的 svn 操作比較耗時(例如 commit 上千個文件),我們不能夠實時地獲取 SharpSvn 執行 svn 操作的日志,我們會以為程序卡住了。那么,如何實時獲取 SharpSvn 操作的日志?
首先, 獲取 SharpSvn 執行 svn 操作日志只能通過聲明 SvnClientReport 對象。這是我們的出現點,那么怎樣聲明一個實時獲取操作日志的 SvnClientReport 對象?先看一下 SvnClientReport 類的構造函數(參考http://docs.sharpsvn.net/current/),
SvnClientReporter(SvnClient, TextWriter);
SvnClientReporter(SvnClient, StringBuilder);
SvnClientReporter(SvnClientArgs, TextWriter);
SvnClientReporter(SvnClientArgs, StringBuilder);
SvnClientReporter(SvnClient, StringBuilder, IFormatPRovider);
SvnClientReporter(SvnClientArgs, StringBuilder, IFormatProvider);
通過 SvnClientReport 類的構造函數,我們可以看出我們只能使用一個 StringBuilder 或者 TextWriter 對象來聲明一個 SvnClientReport 對象。上一節我們已經看到通過 StringBuilder 對象是無法實時獲取 SharpSvn 操作日志的了,那我們只能從 TextWriter 下手了。
通過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)
新聞熱點
疑難解答