【发布时间】:2013-10-01 22:27:09
【问题描述】:
我有一个检查网站商品状态的程序。
由于我之前没有学过线程,所以我只是在我的程序中使用了 system.threading.timer。
我有一个 system.threading.timer 列表和一些 system.threading.timer
List<system.threading.timer> _timerList;
System.threading.timer _timerA;
System.threading.timer _timerB;
System.threading.timer _timerC;
我调用_timerA查看货物状态,并调用_timerList购买货物,当货物到货时,有10个帐户的帐户列表。
我每 500 毫秒执行一次 _timerA。
_timerA = new System.Threading.Timer(new TimerCallback(submit_checkgoods), 0, 0, 500);
在 submit_checkgoods 内部(之前调用了 _timerList.Add(...) ):
if ( goodsIsUp == true)
{
for (int k = 0; k < infolistbb.Count; k++)
{
int copy = k;
_timerList[copy] = new System.Threading.Timer(new TimerCallback(submit_buygoods), copy, 0, 0);
}
}
问题是我发现调用_timerlist[copy]执行很慢。
我用秒表查看了调用_timerlist执行到submit_buygoods结束的时间和执行submit_buygoods的时间。
submit_buygoods 的执行速度确实很快,但是调用过程却是一个接一个。
_timerList[0] 执行完 submit_buygoods 后,_timerList[1] 再执行。
这是 System.threading.timer 线程太多(实际上只有 15 个左右)的缺陷吗?
原因是什么?有什么补救措施吗?切换到 Thread t = new Thread() 会有帮助吗?
【问题讨论】:
-
定时器回调在线程池线程上执行。线程池管理器尝试将执行 TP 线程的数量限制为机器中可用的内核数量。明智的策略。
-
我搜索了Task.Factory.StartNew。它也安排在 ThreadPool 上,并且 StartNew 不保证单独的线程。因为我不太了解线程。如果我希望它们立即单独执行,您能否给我一个建议,我应该使用哪种线程?
-
在我看来您使用的计时器不正确。如果您希望某些事情定期发生,您可以使用计时器。您不会“调用”计时器。更改您的问题以描述您想要做什么,并让我们提出解决方案。不要只是猜测什么可能有效,因为您只是在混淆问题。
-
是的,我用错了。正如我所说,我对线程了解不多,所以我选择 system.threading.timer。这就是为什么我来问这个缓慢的初始化是怎么发生的。我想我描述得很好。第一条评论确实有很大帮助。 “线程池管理器尝试将执行 TP 线程的数量限制为可用的核心数量”。计时器将首先进入池中,它不保证立即初始化。
标签: c# multithreading timer