【问题标题】:What options do I have for long running processes in my C# Console Application?对于 C# 控制台应用程序中长时间运行的进程,我有哪些选项?
【发布时间】:2012-01-07 00:39:37
【问题描述】:

我正在开发一个控制台应用程序,它会启动一个相当长的运行过程(2-3 分钟)。哪些选项可用于显示进度,甚至只是写一个“。”每隔几秒筛选一次,以便用户知道应用没有停止响应?

【问题讨论】:

  • 你可以使用BackgroundWorker
  • 长时间运行的进程是你的代码吗?如果是这样,为什么不在循环中执行写入命令或其他慢速部分?
  • @John:该过程发生在我们的一个类库中,并通过单个方法调用启动。对于我来说,注入 console.writeline(".") 真的不是一个好地方...

标签: c# .net console


【解决方案1】:

您有(至少)3 种方法可以做到这一点:

  • 最简单:在程序启动时,将全局变量设置为 false,然后启动一个线程,将一个点写入控制台,Thread.Sleep() 秒,重复直到变量设置为 true。在你的主线程上做你的工作,完成后将变量设置为 true,然后 Join() 另一个线程。
  • 仍然很简单:添加另一个全局变量,输入 int。在您的工作线程中增加它,每当取得一些进展时,在控制台编写器线程上将间隔减少到 250 毫秒,但只有在进度计数器发生变化时才画一个点。这可以让您了解应用的运行速度
  • 有点高级:在第一步中创建一个布尔值加上一个AutoResetEvent,让控制台编写器线程反复等待事件,当应用程序进行 Set() 事件时。完成后将 boolean 设置为 true 并在 Join()ing 之前再次 Set()。其中的高级部分是了解报告进度的部分。

【讨论】:

  • 正是我想要的。非常感谢!
【解决方案2】:

最简单的方法是,如果您的应用程序具有增量循环,那么您可以在控制台上放置一个简单的句号。不好,但它确实表明“我还活着”。

但这种方法可能会导致信息过多(太多字符进入控制台)或信息太少,因为您会挂接到一些实际上并没有该责任的代码。

因此,也许您可​​以重用的更好方法是创建一个控制台用户类,该类在 1 秒滴答的线程中运行。它可以使用退格和好旧的| / | / - 序列给人以旋转的印象。它还可以检查允许用户退出的按键。

根据用户的性质,另一种选择是使用像 NLog 这样的日志框架。这样一来,您的实现就独立于 UI,您可以在控制台中运行时或多或少地查看正在发生的事情,无论从另一台机器。

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2019-01-30
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多