首页 > 解决方案 > 在具有 longRunning Async main 方法的 ac# 服务中,您应该在服务启动时 .wait ,将任务存储在某处,还是完全忽略它?

问题描述

在我们的许多服务中,OnStart 方法调用了一个 neverEnding 异步任务和 .Wait(),它会执行所有服务工作,直到它被手动关闭。我们做了类似以下的事情(在我来到现场之前就一直这样做)。

MyServiceClass service;
protected override void OnStart(string[] args)
{
    eventLog.WriteEntry("MyService service is starting up.");
    service = new MyServiceClass(this.ServiceName);
}
...
public class MyServiceClass
{
    public MyServiceClass() {
        Task.Run(() => DoServiceWork()).Wait();
    }
    public async Task DoServiceWork() {
        while (true)
        {
            await Task.Delay(1000);//pretend this is actual work being done
        }
    }
}

有什么理由不只是存储任务并继续前进吗?(假设 main 方法有适当的异常处理)

public class MyServiceClass
{
    public Task taskToBeAwaitedOnServiceStop;
    public MyServiceClass() {
        taskToBeAwaitedOnServiceStop = Task.Run(() => DoServiceWork());
    }
}

或者只是完全忽略任务

public class MyServiceClass
{
    public MyServiceClass() {
        _ = DoServiceWork();
    }
}

我正在考虑这些选项,因为我们不喜欢 .waits 浮动(并且更少意味着我们去狩猎时检查的更少)。我在这里要求确定我的替代方案如果实施不会导致奇怪的服务逻辑。

我希望这不是一个太愚蠢的问题,感谢您的帮助:)

标签: c#serviceasync-awaitconstructor

解决方案


推荐阅读