分享个代码,多个StreamWriter同步写入

WM_JAWIN 2014-07-28 05:23:48
利用反射实现,同步将多内容输出到多个TextWriter中
代码:
        private void MultiCall(params object[] ptrs)
{
if (this.Writers.Count == 0)
return;
var st = new StackTrace();
var s = st.GetFrame(1);
var m = s.GetMethod();

var methodName = m.Name;
var twInfo = typeof(TextWriter);

if (ptrs == null || ptrs.Length == 0)
m = twInfo.GetMethod(methodName, new Type[] { });
else
{
Type[] types = new Type[ptrs.Length];
for (var i = 0; i < ptrs.Length; i++)
{
types[i] = ptrs[i].GetType();
}
m = twInfo.GetMethod(methodName, types);
}

foreach (var w in this.Writers)
{
m.Invoke(w, ptrs);
}

}

通过StackTrace()取得调用被调用方法,然后反射出TextWriter上对应的方法,然后调用就搞定了。
重写StreamWriter中几个相关方法,即可完在同步输出
#region override TextWriter
public override void Write(char[] buffer)
{
base.Write(buffer);
MultiCall(buffer);
}
public override void Write(char value)
{
base.Write(value);
MultiCall(value);
}

public override void Write(string value)
{
base.Write(value);
MultiCall(value);
}

public override void Write(char[] buffer, int index, int count)
{
base.Write(buffer, index, count);
MultiCall(buffer, index, count);
}
#endregion


小试一下:

using (log = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "log.txt", false))
{
var con = Console.OpenStandardOutput();
var smw = new StreamMultiWriter(con,Console.OutputEncoding);
smw.AutoFlush = true;
smw.Writers.Add(log);
Console.SetOut(smw);

Console.WriteLine("Console日志同步输入测试");
Console.WriteLine("当前时间:{0}", DateTime.Now);
Console.WriteLine();

smw.Writers.Remove(log);
}

杠杠的,屏幕上的信息,同步记录到Log.txt中

完整代码 点这,我是来坑分的
...全文
241 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2014-07-28
  • 打赏
  • 举报
回复
干啥用的....
十八道胡同 2014-07-28
  • 打赏
  • 举报
回复
来分享技术的?
WM_JAWIN 2014-07-28
  • 打赏
  • 举报
回复
版主们把这个帖子删除了吧
WM_JAWIN 2014-07-28
  • 打赏
  • 举报
回复
太坏了。还不让修改
bdmh 2014-07-28
  • 打赏
  • 举报
回复
什么啊,想要表达什么

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧