我已经在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以获得相同的效果或没有效果。
您的服务的主要结构看起来不错,这不会自己停止。任务还是线程的选择不是太重要。
您的错误发生在
//Logic
内部,无法处理。您将需要某种形式的日志记录才能找到答案。