C# 是否有方法连续镜像Console.Write的结果到集合(数组、列表等)?
我有一个控制台程序,我想不断地镜像控制台的结果。写一个集合,我可以实时查看它的尾部。集合可以是数组、列表等 我想我必须使用某种事件处理程序 我不介意被指向第三方库,例如NLog 更新C# 是否有方法连续镜像Console.Write的结果到集合(数组、列表等)?,c#,.net,visual-studio,.net-4.0,c#-4.0,C#,.net,Visual Studio,.net 4.0,C# 4.0,我有一个控制台程序,我想不断地镜像控制台的结果。写一个集合,我可以实时查看它的尾部。集合可以是数组、列表等 我想我必须使用某种事件处理程序 我不介意被指向第三方库,例如NLog 更新 我需要在内存中维护一个集合,该集合反映当前控制台状态(然后我可以使用套接字发送到远程WinForms应用程序)。撇开细节不谈,我想我可以用几行C来做到这一点——我不想在不需要它的情况下添加一个巨大的日志库。使用log4net在文件中连续转储,然后使用它作为尾部:您可以创建一个简单的助手方法并调用它,而不是Conso
我需要在内存中维护一个集合,该集合反映当前控制台状态(然后我可以使用套接字发送到远程WinForms应用程序)。撇开细节不谈,我想我可以用几行C来做到这一点——我不想在不需要它的情况下添加一个巨大的日志库。使用log4net在文件中连续转储,然后使用它作为尾部:您可以创建一个简单的助手方法并调用它,而不是Console.Write
private void WriteToConsole(string message)
{
myList.Add(message);
Console.Write(message);
}
您可能可以编写一个新的
TextWriter
谁的write
调用来填充列表,而不是写入流。然后需要通过控制台进行设置。使用设置(…)可以设置自定义实现的TextWriter。控制台类允许您替换输出和错误流。正如您在这里所需要的,您可以用一个也记录所写内容的TextWriter来代替它们。示例实现:
class ConsoleLogger : System.IO.TextWriter {
private System.IO.TextWriter oldOut;
private Queue<string> log = new Queue<string>();
private StringBuilder line = new StringBuilder();
private object locker = new object();
private int newline;
private int logmax;
public ConsoleLogger(int history) {
logmax = history;
oldOut = Console.Out;
Console.SetOut(this);
}
public override Encoding Encoding {
get { return oldOut.Encoding; }
}
public override void Write(char value) {
oldOut.Write(value);
lock (locker) {
if (value == '\r') newline++;
else if (value == '\n') {
log.Enqueue(line.ToString());
if (log.Count > logmax) log.Dequeue();
line.Length = newline = 0;
}
else {
for (; newline > 0; newline--) line.Append('\r');
line.Append(value);
}
}
}
}
如果您想编写如下代码:
WriteToConsole("{0} tel is: {1:+### ### ### ###}", "Name", 242352356578);
然后,您可以使用以下代码:
private static Queue<String> q = new Queue<String>(1000);
private static void WriteToConsole(String message)
{
q.Enqueue(message);
Console.Write(message);
}
private static void WriteToConsole(String message, params Object[] r)
{
String s = String.Format(message, r);
q.Enqueue(s);
Console.Write(s);
}
私有静态队列q=新队列(1000);
私有静态void writeConsole(字符串消息)
{
q、 排队(消息);
控制台。写入(消息);
}
私有静态void writeConsole(字符串消息,参数对象[]r)
{
String s=String.Format(消息,r);
q、 排队;;
控制台。写入;
}
请参见。好的,这是可行的。但是,我不想更改现有的console应用程序,当console.Write()有多个参数时,这将产生问题。
private static Queue<String> q = new Queue<String>(1000);
private static void WriteToConsole(String message)
{
q.Enqueue(message);
Console.Write(message);
}
private static void WriteToConsole(String message, params Object[] r)
{
String s = String.Format(message, r);
q.Enqueue(s);
Console.Write(s);
}