之前一篇随笔(使用 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)
新闻热点
疑难解答