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

WM_JAWIN WM_JAWIN 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
利用反射实现,同步将多内容输出到多个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中

完整代码 点这,我是来坑分的
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
WM_JAWIN
C# 111,128 成员 642,536 内容