以前一篇随笔(使用 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)