C# .net 4.5正确的Windows服务启动方法

C# .net 4.5正确的Windows服务启动方法,c#,.net,windows,service,C#,.net,Windows,Service,既然任务似乎是实现大多数多线程的公认方式,那么这是编写windows服务启动方法的“正确”方式吗 start方法将很快完成,但我对任务不熟悉,希望确保这是实现服务工作的正确方法 我已经测试过了,它似乎有效,但我想知道这种方法是否有副作用 protected override void OnStart(string[] args) { Task.Run(() => MyServiceThingsToDo()); } private void MyServiceThingsToDo(

既然任务似乎是实现大多数多线程的公认方式,那么这是编写windows服务启动方法的“正确”方式吗

start方法将很快完成,但我对任务不熟悉,希望确保这是实现服务工作的正确方法

我已经测试过了,它似乎有效,但我想知道这种方法是否有副作用

protected override void OnStart(string[] args)
{
    Task.Run(() => MyServiceThingsToDo());
}

private void MyServiceThingsToDo()
{
    // all the stuff I want to do like read from database, send alerts
    // even start other tasks
}

我已经查看了常用的源代码,但找不到任何源代码(MSDN或其他)明确指出这是现在构建服务的正确方法。

我在企业应用程序中使用过这一方法,它可以正常工作:

_messageQueueWatcher = new Task(_engineService.StartMessageQueueWatcher, _cancelTokenSource.Token, TaskCreationOptions.LongRunning);
_messageQueueWatcher.Start();

我通过异步调用OnStart(string[]args){}

任务(通常)使用线程池线程来运行它。不应将其用于长期任务(例如服务的实现)。所以,不……我不会说使用Task类是实现服务的正确方法。你应该直接创建一个新的线程。这是基于观点的。一件很明显的事情是异常处理。@PeterDuniho不一定。您可以使用
Task.Factory.StartNew
并指定
TaskCreationOptions.LongRunning
来明确要求创建新线程(而不是线程池线程)。它不是基于意见的,但是:它取决于服务的功能。我知道有些服务基本上是先初始化,然后等待有人调用它们的API(由框架处理,因此没有线程等待),在这种情况下,OnStart是在没有单独线程的情况下完成这项工作的最佳场所。我通常使用start方法处理初始化-如果出现问题(配置错误等),我希望start失败,以便其他相关服务不会启动。@TomTom建议尽快发布
OnStart
。您可能仍在后台线程中等待API调用。