c# - System.Threading.Timer 不连续

标签 c# multithreading timer

我在创建连续计时器时遇到了麻烦。在计时器上创建了多个交错的线程,这些线程将运行一段时间然后完全停止。我允许的最大线程数是 5,计时器间隔设置为 10000。因此理论上每 2 秒将执行 1 个线程。

这种情况会发生一段时间,但随后就会停止。目前我正在控制台应用程序中进行测试并将响应写入该应用程序。

我不太确定这里发生了什么

internal class EngineThreadGenerator
{
    private readonly AutoResetEvent _autoEvent;
    private readonly Action<string, string> _processQueueDelegate;
    private readonly Action<string, string> _purgeQueueDelegate;

    private void createAllowedEmailThreads()
    {
        for (int counter = 0; counter < AppSettings.ProcessQueueAllowedThreads; counter++)
        {
            EmailThread _emailThread = new EmailThread(_collection, _processQueueDelegate, _purgeQueueDelegate);
            TimerCallback _timerCallback = _emailThread.InitEmailThread;
            Timer _stateTimer = new Timer(_timerCallback, _autoEvent, 0, AppSettings.ProcessIntervalInMilliseconds);

            pauseLoop();
        }
    }

非常感谢这里的任何帮助!干杯!

最佳答案

您的计时器在 3 分钟后死亡的原因是您有大量可用内存。

这意味着垃圾收集器需要大约 3 分钟才能找到您的对象,然后再进行收集。

您应该在计时器的整个生命周期内保留对计时器的引用。由于您没有这样做,一旦循环结束,计时器就有资格进行垃圾回收。

3 分钟后,或者每当 GC 到达它时,计时器就会被收集,您的代码将停止执​​行。

因此,保留对计时器对象的引用,您应该已经准备就绪。

这是一个简单的 LINQPad用于测试的脚本:

void Main()
{
    new Timer(Callback, null, 0, 1000);
    Thread.Sleep(5000);
    Debug.WriteLine("collecting");
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    Debug.WriteLine("collected");
    Thread.Sleep(5000);
}

static void Callback(object state)
{
    Debug.WriteLine("callback");
}

观察到一旦主线程运行GC,回调就停止了。另一方面,如果您将计时器复制到一个字段中:

Timer _Timer;

void Main()
{
    _Timer = new Timer(Callback, null, 0, 1000);
    ...

计时器在 GC 之后继续滴答作响。

关于c# - System.Threading.Timer 不连续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5902328/

相关文章:

c# - 如果我不从 asp.net 中的图像上传控件中选择图像,我想在数据库中插入 null

java - 我应该如何使用 AtomicInteger 作为引用计数器来管理某些资源?

C# 为什么定时器频率非常低?

c# - 为什么这会给出 NullReferenceException?

c# - 从 Windows 资源管理器拖放到我的应用程序的文本框中

c# - 在一个应用程序中使用 dapper 和 MongoDb 是否正确

java - 当 PipedReader 与 PipedWriter 位于不同线程时,如何将它们连接起来?

c++ - C++中线程的简单示例

c++ - 主程序中的 boost 定时器中断

python - 如何在 Python 中运行后台计时器