强制控制台应用程序即使在C#中处于繁忙状态也要打印

拉希尔·汗(Raheel Khan)

我有一个简单的控制台应用程序,如下所示:

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_OnStartingServer_OnStarted消息。对构造函数的调用不是线程调用,而是对server.Start的调用在内部启动线程,初始化一些套接字等。但是,事件OnStartingOnStartedSAME线程上触发,因此它的线程方面不重要。

看来,在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实际执行的操作:

  1. 输入锁(由于未启动服务器,因此大概是非阻塞的)
  2. **引发OnStarting事件**
  3. 启动线程
  4. 重新启动秒表
  5. **引发OnStarted事件**
  6. 退货

这些任务都不是特别密集的。OnStarting和OnStarted调用之间的延迟可能在微秒范围内。

这三个状态消息似乎将同时打印,因为在服务器实例化,输入Server.Start方法和从Server.Start方法返回之间没有经过可观的时间

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

强制控制台应用程序即使在C#中处于繁忙状态也要打印

来自分类Dev

如果用户在C#程序中打印“ x”,如何使控制台应用程序退出?

来自分类Dev

如何在控制台应用程序C#中打印值

来自分类Dev

Windows 8.1中无法打印C#控制台应用程序

来自分类Dev

在C#的控制台应用程序中从1到1000打印数字

来自分类Dev

如何从C#中的控制台应用程序运行Web应用程序

来自分类Dev

安排C#控制台应用程序

来自分类Dev

Gmail控制台应用程序C#

来自分类Dev

使C#控制台应用程序与wpf交互

来自分类Dev

随机统计应用程序?(控制台C#)

来自分类Dev

河内C#塔控制台应用程序。

来自分类Dev

C#控制台应用程序即服务

来自分类Dev

控制台应用程序 c# 舍入

来自分类Dev

VS 2017 控制台应用程序 (C#)

来自分类Dev

从其他C#控制台应用程序运行C#控制台应用程序

来自分类Dev

如何在C#中的控制台应用程序中激活代码的不同部分

来自分类Dev

在 C# 控制台应用程序中检查的 Delphi 应用程序中打开的互斥锁

来自分类Dev

C#很小的控制台应用程序(Visual Studio 2012)中的默认线程

来自分类Dev

C#控制台应用程序中剪贴板的奇怪行为

来自分类Dev

在C#控制台应用程序中添加“ --help”参数

来自分类Dev

输出屏幕在C#控制台应用程序中突然消失?

来自分类Dev

C#控制台应用程序中的多个全局热键

来自分类Dev

在C#的控制台应用程序中验证字符串仅包含字母

来自分类Dev

如何从C#控制台应用程序写入Azure WebJobs中的日志?

来自分类Dev

如何使用C#在内存中执行.NET控制台应用程序?

来自分类Dev

C#线程:新线程中的控制台应用程序不可见

来自分类Dev

在C#控制台应用程序app.config中嵌入Webclient的凭据?

来自分类Dev

如何在C#控制台应用程序中播放背景音乐

来自分类Dev

如何在C#控制台应用程序中返回简单的int值

Related 相关文章

  1. 1

    强制控制台应用程序即使在C#中处于繁忙状态也要打印

  2. 2

    如果用户在C#程序中打印“ x”,如何使控制台应用程序退出?

  3. 3

    如何在控制台应用程序C#中打印值

  4. 4

    Windows 8.1中无法打印C#控制台应用程序

  5. 5

    在C#的控制台应用程序中从1到1000打印数字

  6. 6

    如何从C#中的控制台应用程序运行Web应用程序

  7. 7

    安排C#控制台应用程序

  8. 8

    Gmail控制台应用程序C#

  9. 9

    使C#控制台应用程序与wpf交互

  10. 10

    随机统计应用程序?(控制台C#)

  11. 11

    河内C#塔控制台应用程序。

  12. 12

    C#控制台应用程序即服务

  13. 13

    控制台应用程序 c# 舍入

  14. 14

    VS 2017 控制台应用程序 (C#)

  15. 15

    从其他C#控制台应用程序运行C#控制台应用程序

  16. 16

    如何在C#中的控制台应用程序中激活代码的不同部分

  17. 17

    在 C# 控制台应用程序中检查的 Delphi 应用程序中打开的互斥锁

  18. 18

    C#很小的控制台应用程序(Visual Studio 2012)中的默认线程

  19. 19

    C#控制台应用程序中剪贴板的奇怪行为

  20. 20

    在C#控制台应用程序中添加“ --help”参数

  21. 21

    输出屏幕在C#控制台应用程序中突然消失?

  22. 22

    C#控制台应用程序中的多个全局热键

  23. 23

    在C#的控制台应用程序中验证字符串仅包含字母

  24. 24

    如何从C#控制台应用程序写入Azure WebJobs中的日志?

  25. 25

    如何使用C#在内存中执行.NET控制台应用程序?

  26. 26

    C#线程:新线程中的控制台应用程序不可见

  27. 27

    在C#控制台应用程序app.config中嵌入Webclient的凭据?

  28. 28

    如何在C#控制台应用程序中播放背景音乐

  29. 29

    如何在C#控制台应用程序中返回简单的int值

热门标签

归档