Task.Run() & Task.Delay() 一段时间后终止
Task.Run() & Task.Delay() terminated after sometime
我在 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
}
}
});
}
}
如果在Task.Run
内发生任何异常,将在等待任务时保存并抛出。您没有在等待任务,因此发生的任何异常都不会显示。
您应该使用 await
关键字或对其调用 .Wait()
来等待 Task.Run
。
当您产生多个任务时,您可以将它们全部添加到一个列表中,然后调用 await Task.WhenAny(tasks)
,当任何任务完成时,它将 return,因此您可以采取相应的行动。
你的主要问题在
catch (Exception ex)
{
throw;
}
这实际上意味着您不会发现任何错误。您不妨删除 try/catch 以获得相同的效果,或者没有效果。
您的服务的主要结构看起来不错,它不会自行停止。 Task 与 Thread 的选择不是太重要。
您的错误发生在 //Logic
内部,未得到处理。
您需要某种形式的日志记录才能找到答案。
我在 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
}
}
});
}
}
如果在Task.Run
内发生任何异常,将在等待任务时保存并抛出。您没有在等待任务,因此发生的任何异常都不会显示。
您应该使用 await
关键字或对其调用 .Wait()
来等待 Task.Run
。
当您产生多个任务时,您可以将它们全部添加到一个列表中,然后调用 await Task.WhenAny(tasks)
,当任何任务完成时,它将 return,因此您可以采取相应的行动。
你的主要问题在
catch (Exception ex)
{
throw;
}
这实际上意味着您不会发现任何错误。您不妨删除 try/catch 以获得相同的效果,或者没有效果。
您的服务的主要结构看起来不错,它不会自行停止。 Task 与 Thread 的选择不是太重要。
您的错误发生在 //Logic
内部,未得到处理。
您需要某种形式的日志记录才能找到答案。