使用基于计时器/秒表的事件无限期地循环通过ConcurrentQueue <t>

时间:2017-07-13 06:34:42

标签: c# while-loop do-while concurrent-queue

在我的CheckQueue()方法中,我想要做的就是不断从队列中读取(通过调用AppQ.Connect(Time))和TryDequeue每个项目。经过一段时间(可能是一分钟左右)之后,我想回到队列 - 再次连接,检查它是否有一些元素(AppQ.Count),读取它们(TryDequeue())并做这个过程是无限期的。

这是一个应用程序,它将成为Windows服务(目前是用于测试目的的Windows窗体应用程序),它将每天运行一天,并在某些计算机上运行的任何应用程序中出现停机时提醒开发人员。我知道我必须使用While-Loop,但我不确定是使用基于Timer的事件还是使用Stopwatch

更多上下文:我也有一种感觉,我应该考虑使用do-while循环而不是while看到前者执行某些操作(通过调用{{1}来加载消息然后检查退出条件(如果AppQ.Connect(time)),而AppQ.Count <= 0则相反。

考虑到它是线程安全的,我应该使用while吗?

有什么建议吗?

BlockingCollection<T>

其他:人们可以发表评论我可能出错的地方,而不仅仅是投票而不是给出理由

1 个答案:

答案 0 :(得分:1)

为了偶尔检查一下队列,你需要设置一个计时器:

 CheckTimer = new System.Threading.Timer(CheckQueue, null, TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1000));

您应该在初始化服务时创建计时器。

在CheckQueue方法中,您需要一个循环来处理队列中的所有数据。

private void CheckQueue(object dummy)
{
    // The dummy is null, its there because it is a Timer event.
    AppIP.Connect(50);

    AppInfo appInfo;
    while(AppQ.TryDequeue(out appInfo))
    {
        // Process the appInfo
    }
}

请注意,System.Threading中的计时器将在不同的线程中运行,即使当前事件仍在运行,也会发生下一个事件的处理!