我正处于Windows服务多线程项目的中间,我需要你们的一些输入来成功运行它。下面是代码并描述我正在尝试做什么和问题。
// I created a new thread and call MyTimerMethod() from the Main method.
private void MyTimerMethod()
{
timer = Timers.Timer(5000)
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Start();
// make this thread run every time.
Application.Run();
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
for(int i = 0; i < SomeNum; i++) //SomeNum > 0
ThreadPool.QueueUserWorkItem(WaitCallback(MyWorkingMethod),null);
}
private void MyWorkingMethod(object state)
{
// each thread needs to go and check the status and print if currentStatus = true.
// if currentStautus = true then that jobs is ready to print.
// FYI ReadStatusFromDB() from the base class so I cannot modify it.
ReadStatusFromDB(); // ReadStatusFromDB() contains jobs to be printed.
// after doing some work store procedure update the currentStatus = false.
//do more stuff.
}
简而言之,程序每五秒运行一次,检查是否还有更多工作要做。如果有则从线程池创建一个新线程并推入队列。现在我的问题是队列中有多个线程。即使是currentStatus = false多个线程也会抓取相同的作业并尝试打印。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:0)
我建议创建一个BlockingCollection个工作项,并将您的程序构建为生产者/消费者应用程序。当提交作业时(通过计时器滴答,或者可能是其他方式),它只是添加到集合中。
然后,您有一个或多个持久性线程在等待集合TryTake。当一个项目被添加到集合中时,其中一个等待的线程将获取并处理它。
这种结构有几个优点。首先,它可以防止多个线程处理同一个项目。其次,它限制了将同时处理项目的线程数。第三,线程正在对集合进行非繁忙等待,这意味着它们不会消耗CPU资源。唯一的缺点是你有多个持久线程。但是如果你大部分时间都在处理项目,那么持久性线程根本不是问题。