gpt4 book ai didi

c# - Task.Run() & Task.Delay() 在一段时间后终止

转载 作者:太空宇宙 更新时间:2023-11-03 19:39:29 25 4
gpt4 key购买 nike

我在 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 秒执行一次我的逻辑。

代码运行良好,但一段时间后,我的所有线程都终止了(不工作)。我的意思是,逻辑中的代码在几个小时后无法正常工作。一点也不异常(exception)。任何人都可以建议出了什么问题。提前谢谢你。

编辑代码:

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
}
}
});
}
}

最佳答案

如果在 Task.Run 中发生任何异常,它将被保存并在等待任务时抛出。您没有等待任务,因此发生的任何异常都不会显示。

您应该等待 Task.Run,方法是使用 await 关键字或对其调用 .Wait()

当您生成多个任务时,您可以将它们全部添加到一个列表中,然后调用 await Task.WhenAny(tasks),它会在任何任务完成时返回,因此您可以按指示行动。

Read this article for more information

关于c# - Task.Run() & Task.Delay() 在一段时间后终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com