在.Net 4.0框架上使用C#,我有一个等待文件系统事件的Windows Forms主线程(唯一一个,直到现在),然后必须对这些事件提供的文件启动一些预定义的处理。
我打算做以下事情:
因为我以前没有编程线程(我基本上使用Albahari作为我的指南针)但我绝对想要,我有几个问题只是提前发现可能的头痛:
答案 0 :(得分:2)
如果您的目标是.Net Framework 4,Blocking Collection听起来会解决您的问题;即,当“work”项在队列中可用时(在添加新文件时添加到事件处理程序上的队列中)创建一个新的线程池线程,并在该线程上异步处理它们。
您可以在生产者/消费者队列中使用一个:
E.g:
/// <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();
}
}
}