【问题标题】:Most appropriate thing to do with Main() method for long running async processes对长时间运行的异步进程使用 Main() 方法最合适的事情
【发布时间】:2010-12-15 21:16:53
【问题描述】:

我有一个基本的 C# 控制台应用程序,它执行一个相当长的运行过程,涉及计时器和异步请求。 Main() 方法的唯一目的是初始化计时器,然后让它们在接下来的几个小时内完成它们的工作。

我知道 Windows 服务适用于许多长时间运行的进程,但感觉不适合这个用例(需要时手动执行,总是在一天内终止,没有安装服务的障碍等)。

现在,我只是这样做:

while (true)
    Thread.Sleep(5000);

抛出一个 Thread.Sleep 似乎......由于某种原因很脏。或者这真的是在异步过程完成之前阻止应用程序终止的最佳方法吗?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以使用一个/多个 ManualResetEvent 从后台线程到前台线程进行通信。

    Main 中的前台线程可以等待,直到所有后台线程都发出信号表明它们已完成。

    【讨论】:

      【解决方案2】:

      您不应该是 Thread.Sleep,但您不应该等待某种事件,当有任何事情要做时会发出信号,包括关闭自己。

      您描述的应用程序更适合作为服务,而不是控制台应用程序。

      【讨论】:

      • 但是对于只需要手动运行并且每次都必须进行调整的东西来说,服务是如此繁重。但显然 Service 实现了一些类似于我正在寻找的逻辑 - 那么 ServiceBase 抽象是做什么的?
      • ServiceBase 会为您处理等待。但主要原因是,如果您的应用程序在结束时闲置了 小时 ,它什么都不做,它就有在用户会话终止时被关闭的风险。作为服务运行将使应用程序在用户注销/登录事件之间保持活动状态,并允许它完成工作,无论是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2014-02-08
      相关资源
      最近更新 更多