【问题标题】:How do I start a service thread using the TPL?如何使用 TPL 启动服务线程?
【发布时间】:2014-10-12 21:32:51
【问题描述】:

过去,我使用 Thread 对象创建了服务的主线程。现在我正在尝试将其更新为 TPL。不幸的是,服务在我的循环中通过一次后结束。我需要做什么才能使任务保持活力?

    protected override void OnStart(string[] args)
    {
        _workerThread = Task.Run(() =>
        {
            while (true)
            {
                Console.WriteLine("go");
                Thread.Sleep(10000);
            }
        });
    }

更多信息:

为了调试服务,如果 Environment.UserInteractive 设置为 true,我设置了一个标志以将服务作为控制台应用程序启动。所以我想我需要它继续在控制台模式和服务中运行。

【问题讨论】:

  • “结束”是什么意思?那应该可以正常工作。 (虽然你会想要TaskOptions.LongRunning
  • 您检查过您的事件日志是否有错误,因为服务不会“结束”,除非停止
  • @DavidG:我不这么认为;服务控制管理器始终保持自己的线程运行,因此服务不需要这样做。但这将是 Win32 线程,而不是 .NET 线程;也许当最后一个 .NET 线程退出时 .NET 会自动退出进程,即使还有 Win32 线程仍在运行?
  • @HarryJohnston 我不确定,几个月前我不得不开发服务应用程序。尝试挖掘一些代码,但它们都启动计时器。现在要去玩了...
  • @HarryJohnston 不,发布的代码没有任何问题。它一定是由于其他地方的某种未处理的异常而结束。

标签: c# multithreading windows-services task-parallel-library


【解决方案1】:

新建Thread时,默认为前台线程(IsBackground设置为false)。这意味着您的控制台应用程序在线程结束之前不会结束,即使 Main 在此之前返回。

另一方面,Tasks 在只包含后台线程的线程池上运行。这意味着当您的Main 返回时,应用程序将退出,即使还有一些Task 仍在运行。

您可以在Main 末尾的Task 上通过Waiting 解决此问题。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多