我有一个简单的控制台应用程序,如下所示:
private static void Main (string [] args)
{
System.Console.WriteLine("Initializing context...");
Database.Context.Initialize();
System.Console.WriteLine("Creating server...");
var server = new Server();
server.OnStarting += Server_OnStarting;
server.OnStarted += Server_OnStarted;
System.Console.WriteLine("Starting server...");
server.Start();
}
private static void Server_OnStarting (object sender, EventArgs e)
{
System.Console.WriteLine("Server_OnStarting.");
}
private static void Server_OnStarted (object sender, EventArgs e)
{
System.Console.WriteLine("Server_OnStarted.");
}
服务器启动方法:
public bool Start ()
{
bool result = false;
lock (this._SyncRoot)
{
if (!this.Running)
{
this.Stopwatch.Reset();
this.RaiseOnStarting();
this.Running = true;
this.Terminate = false;
this.ThreadObject = new System.Threading.Thread(new System.Threading.ThreadStart(this.ProcessInternal));
this.Stopwatch.Restart();
this.ThreadObject.Start();
this.RaiseOnStarted();
result = true;
}
}
return (result);
}
输出:
在的三个Console.WriteLine
呼叫中Main
,只有第一个立即被打印。这是可以理解的,因为所有操作都Database.Context.Initialize
发生在同一线程上。然而,印刷Creating server...
和Starting server...
被延迟,并与聚集在一起Server_OnStarting
和Server_OnStarted
消息。对构造函数的调用不是线程调用,而是对server.Start的调用在内部启动线程,初始化一些套接字等。但是,事件OnStarting
和OnStarted
在SAME线程上触发,因此它的线程方面不重要。
看来,在Initializing context...
打印完之后,无论我将调用放在何处Console.WriteLine
,它都不会更新控制台窗口,直到server.Start在触发这两个事件之后才返回。
有没有办法在等待服务器启动时强制控制台更新?
有没有办法在等待服务器启动时强制控制台更新?
默认情况下,控制台的行为是这样的;实际上,没有(受支持的)机制强制其行为有所不同。启动Console.Out属性时,AutoFlush
基础属性TextWriter
设置为true。的文档AutoFlush
明确指出了这一点(添加了重点):
例如,当您写入用户希望立即得到反馈的设备时,请将AutoFlush设置为true。Console.Out是以下情况之一:在每次调用StreamWriter.Write之后,内部用于写入控制台的StreamWriter都会刷新其所有内部状态,但编码器状态除外。
(请注意,AutoFlush
不能直接查询,因为实际的实现使用线程安全的包装器;但是,您可以使用调试器或反射来检查的值是否((Console.Out as TextWriter.SyncTextWriter)._out as StreamWriter).AutoFlush
为true。)
回到原来的问题:
看来,在打印Initializing context ...之后,无论我将调用放在何处
Console.WriteLine
,它都不会更新控制台窗口,直到server.Start
触发两个事件后返回。
让我们看一下Server.Start
实际执行的操作:
这些任务都不是特别密集的。OnStarting和OnStarted调用之间的延迟可能在微秒范围内。
这三个状态消息似乎将同时打印,因为在服务器实例化,输入Server.Start
方法和从Server.Start
方法返回之间没有经过可观的时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句