2012-10-12 66 views
3

在.Net 4.0框架中使用C#,我有一个等待文件系统事件的Windows窗体主线程(唯一一个,直到现在),然后必须启动对这些文件提供的文件的一些预定义处理事件。队列管理和新线程

我打算做到以下几点:

  • A1。要在主进程启动时立即创建单独的线程;
  • A2。让主线程放入队列(FIFO)中的文件名为 ;
  • A3。由一个计时器每隔秒钟触发新的线程;
  • A4。让新线程读取队列,如果有一个项目 来执行处理,那么让它取消处理的队列项目 。

因为我从来没有编程(我基本上使用阿尔巴哈利作为我的指南针)之前的线程,但我肯定要,我有几个问题,只是被发现可能重头痛提前:

  • Q1。如果主进程只写入,并且新进程只取消队列项目,我可以在队列中引发并发问题吗?换句话说:在这种情况下同步是一个重要问题吗?第二季度销售价格为
  • 。我已经看到我可以从头创建一个新线程,或者可以重用现有池中可用的线程之一。在这种情况下使用池中的线程更安全/更简单?
  • Q3。是否有任何缺点,无限期地保持新线程活动,并只对计时器做出响应,直到主进程关闭?
+0

http://stackoverflow.com/questions/7841390/c-how-to-use-a-mutex –

回答

2

如果你的目标是.Net Framework 4,Blocking Collection听起来像它可以解决你的问题;即当“工作”项在队列上可用时创建新的线程池线程(添加到添加新文件时添加到事件处理程序的队列中)并在该线程上异步处理它们。

你可以在一个生产者/消费者队列使用一个:

如:

/// <summary> 
/// Producer/consumer queue. Used when a task needs executing, it’s enqueued to ensure order, 
/// allowing the caller to get on with other things. The number of consumers can be defined, 
/// each running on a thread pool task thread. 
/// Adapted from: http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT 
/// </summary> 
public class ProducerConsumerQueue : IDisposable 
{ 
    private BlockingCollection<Action> _taskQ = new BlockingCollection<Action>(); 

    public ProducerConsumerQueue(int workerCount) 
    { 
     // Create and start a separate Task for each consumer: 
     for (int i = 0; i < workerCount; i++) 
     { 
      Task.Factory.StartNew(Consume); 
     } 
    } 

    public void Dispose() 
    { 
     _taskQ.CompleteAdding(); 
    } 

    public void EnqueueTask(Action action) 
    { 
     _taskQ.Add(action); 
    } 

    private void Consume() 
    { 
     // This sequence that we’re enumerating will block when no elements 
     // are available and will end when CompleteAdding is called. 
     // Note: This removes AND returns items from the collection. 
     foreach (Action action in _taskQ.GetConsumingEnumerable()) 
     { 
      // Perform task. 
      action(); 
     } 
    } 
} 
+0

谢谢!一个很好的提示! – Daniel