【问题标题】:Slow initialization of multiple system.threading.timer多个system.threading.timer初始化缓慢
【发布时间】: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


【解决方案1】:

使用任务而不是线程,它们更适合短期工作。

Task.Factory.StartNew(submit_buygoods);

附:也许你不应该每 500 毫秒就敲一次服务器,否则你的 IP 可能会被封禁。

【讨论】:

  • 我试过了,同样的事情发生了。但是一个 thread = new thread() 工作。无论如何,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 2014-11-18
  • 1970-01-01
  • 2012-10-31
  • 2023-01-19
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多