【发布时间】:2014-12-16 23:26:35
【问题描述】:
我有一个 Windows 服务,其线程每 2 分钟运行一次。
while (true)
{
try
{
repNeg.willExecuteLoopWithTasks(param1, param2, param3);
Thread.Sleep(20000);
}
在这里面我有一个任务循环:
foreach (RepModel repModelo in listaRep)
{
Task t = new Task(() => { this.coletaFunc(repModelo.EndIp, user, tipoFilial); });
t.Start();
}
但我认为这个实现是错误的。我只需要为列表中的每个元素运行一个任务, 并且,当特定任务完成时,请稍等片刻,然后重新开始。
M8 我得说我这里有两种情况。
1 - 我等不及所有任务完成。因为有些任务可能需要 2 个小时以上才能完成,而另一些任务可能只需要 27 秒。
2 - 我的任务列表可以更改。这就是为什么我有一个线程。每 2 分钟我的线程获取一个要执行的任务列表,然后开始一个循环。
但有时我的任务还没有完成,另一个线程重新开始,然后我的日志中出现奇怪的事情。 我尝试使用字典来解决我的问题,但经过一段时间的执行,有时需要几天,我的日志显示:
“System.IndexOutOfRangeException”
【问题讨论】:
-
你不需要任务,只要调用那个函数。
-
我认为您应该考虑使用 Timer 类。你的实现不好。我会研究异步方法。你不想阻塞线程。
-
@Derek 如果它正在做预期的工作,它是一个阻塞线程吗?
-
旁注:
Thread.Sleep(20000)将休眠 20 秒,而不是 2 分钟。 -
使用 Thread.Sleep 不是一个好习惯 imo,你所做的就是从线程池中取出一个线程,让它在 2 分钟内什么都不做。那是不好的做法,因为它可能会回到用作其他资源的 threadppol 中。 @D斯坦利