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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Task.Run()和Task.Delay()在一段时间后终止相关的知识,希望对你有一定的参考价值。

我已经在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
                }
            }
        });
    }
}
答案

你的主要问题在于

catch (Exception ex)
{
    throw;
}

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

您的服务的主要结构看起来不错,这不会自行停止。 Task vs Thread的选择并不重要。

您的错误发生在//Logic内部并且未处理。

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

另一答案

如果在Task.Run中发生任何异常,则在等待任务时将保存并抛出该异常。您没有等待任务,因此任何已发生的异常都不可见。

您应该使用Task.Run关键字或者在其上调用await等待.Wait()

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

Read this article for more information

以上是关于Task.Run()和Task.Delay()在一段时间后终止的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET 2.0 在 XP 上运行 .NET 4.5 程序 [关闭]

在键盘事件中使用 CancellationToken 调用 Task.Delay 时出现 TaskCanceledException

C#中的Task.Delay()和Thread.Sleep()区别

等待 Task.Delay() 与 Task.Delay().Wait()

15.3 Task Task.Yield和Task.Delay说明

何时使用Task.Delay,何时使用Thread.Sleep?