Task.Run()和Task.Delay()在一段时间后终止

时间:2019-04-17 09:13:41

标签: c# async-await windows-services task scheduled-tasks

我已经在c#中创建了Windows服务,并且在该服务中,我创建了4个线程,每10秒运行一次它们在后台运行。

下面是代码:

var ThreadSize = 4;    
for (int i = 0; i < ThreadSize; i++)
{
    Task.Run(async () =>
    {
        while (1 == 1)
        {
            try
            {
                //Logic
                await Task.Delay(10000, cancelSource.Token);
            }
            catch (Exception ex)
            {
                //Log the exception
            }
        }
    });
}

for循环将仅执行一次,并将创建4个线程。我正在使用Task.Delay等待线程10秒钟,然后再次执行我的逻辑。它会每10秒执行一次我的逻辑。

代码工作正常,但是一段时间后,我的所有线程都被终止(不工作)。我的意思是,几个小时后,逻辑中的代码无法正常工作。 一点也不例外。 谁能建议出什么问题了。 预先谢谢你。

修改后的代码:

CancellationTokenSource cancelSource;

protected override void OnStart(string[] args)
{
    cancelSource = new CancellationTokenSource();
    Process.StartProcess(cancelSource);
}

protected override void OnStop()
{
    cancelSource.Cancel();
}


public static void StartProcess(CancellationTokenSource cancelSource)
{
    var ThreadSize = 4;
    for (int i = 0; i < ThreadSize; i++)
    {
        Task.Run(async () =>
        {
            while (1 == 1)
            {
                try
                {
                    //Logic
                    await Task.Delay(10000, cancelSource.Token);
                }
                catch (Exception ex)
                {
                    //Log the exception
                }
            }
        });
    }
}

2 个答案:

答案 0 :(得分:4)

如果Task.Run中发生任何异常,将在等待任务时将其保存并引发。您不是在等待任务,因此不会看到任何已发生的异常。

您应该通过使用Task.Run关键字或调用await来等待.Wait()

在生成多个任务时,可以将所有任务添加到列表中,然后调用await Task.WhenAny(tasks),当任何任务完成时,它将返回,因此您可以采取相应的行动。

Read this article for more information

答案 1 :(得分:1)

您的主要问题出在

catch (Exception ex)
{
    throw;
}

这实际上意味着您不会发现任何错误。您也可以删除try / catch以获得相同的效果,或者没有效果。

您的服务的主要结构看起来不错,这不会自行停止。任务还是线程的选择不是太重要。

您的错误发生在//Logic内部,没有得到处理。

您将需要某种形式的日志记录才能找到答案。