2012-10-16 76 views
0

我在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

我建议创建BlockingCollection工作项目,并将您的程序构建为生产者/消费者应用程序。当提交工作时(通过计时器滴答或者其他方式),它只是添加到集合中。

然后,您将有一个或多个持久线程在TryTake的集合上等待。当一个项目被添加到集合中时,那些等待线程中的一个将获得并处理它。

这种结构有几个优点。首先,它防止多个线程在同一个项目上工作。其次,它限制了同时处理项目的线程数量。第三,线程在集合上进行非繁忙的等待,这意味着它们不占用CPU资源。唯一的缺点是你有多个持久线程。但是如果你大部分时间都在处理项目,那么持久线程根本就不是问题。

+0

非常感谢您的意见。我对这项技术完全陌生,我想修改这段代码而不是编写新的代码。 – Lakhae