在我的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>
其他:人们可以发表评论我可能出错的地方,而不仅仅是投票而不是给出理由
答案 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中的计时器将在不同的线程中运行,即使当前事件仍在运行,也会发生下一个事件的处理!