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()