6

我有一个 Windows 服务,并且我已经编写了在 OnStart() 事件中运行任务的代码:

 protected override void OnStart(string[] args)
        {
            this.DoTask();
        }

private void DoTask()
        {
            Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling());

            try
            {
                Task.Wait(task1);
            }
            catch (Exception ex)
            {
                this.Log.Error("Failed running the task", ex);
            }           
        }

DoTask 是一个永无止境的循环。只有在服务停止时才会停止。

但是当我尝试启动服务时,它会等待很长时间,然后给我以下错误:

Windows could not start the ... service on Local Computer.
Error 1053: The service did not respond to the start or control request in a timely fashion.

如何解决?

4

3 回答 3

8

你为什么要等你的任务完成?

我认为Task.Wait正在阻塞您当前的线程,然后您在启动服务时会超时。

编辑:您需要删除此块:

try
{
    Task.Wait(task1);
}
catch (Exception ex)
{
    this.Log.Error("Failed running the task", ex);
}  

Task.Wait确实阻塞了您当前的线程。根据MSDN

任务.等待方法

等待任务完成执行。

编辑 2改为这样做

Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()).ContinueWith( t =>
{
     var aggException = t.Exception.Flatten();
     foreach(var ex in aggException.InnerExceptions)
         this.Log.Error("Failed running the task", ex);
}, 
TaskContinuationOptions.OnlyOnFaulted);
于 2013-04-12T14:16:17.927 回答
2

我想这是因为您正在等待OriginalFileProcessor.StartPolling()结束,但这永远不会发生。您应该将您的任务实例移动到一个单独的成员中,而不是等待它完成:

private Task m_task = null;

private void DoTask()
{
    try
    {
        m_task = Task.Factory.StartNew(() => this.StartPolling());
    }
    catch
    {
        this.Log.Error("Unable to start task", ex);
        throw;  // Rethrow, so that the OS knows, there was something wrong.
    }           
}

private void StartPolling()
{
    try
    {
        this.OriginalFileProcessor.StartPolling();
    }
    catch (Exception ex)
    {
        this.Log.Error("Failed running the task", ex);
    }
}
于 2013-04-12T14:17:58.220 回答
1

在循环中,您需要检查服务状态是否为“停止”并退出循环。在操作系统决定杀死您之前,您有 5 秒钟的时间来执行此操作。

于 2013-04-12T14:14:49.190 回答