在 .Net 4.0 框架上使用 C#,我有一个 Windows 窗体主线程(迄今为止唯一的一个)等待文件系统事件,然后必须对这些事件提供的文件启动一些预定义的处理。
我计划执行以下操作:
- A1。当主进程启动时立即创建一个单独的线程;
- A2。让主线程将文件名放入队列(FIFO)中
处理;
- A3。让计时器每 n 触发一次新线程
秒;
- A4。如果有项目,则让新线程读取队列
执行处理,然后让它取消队列项目
处理。
因为我以前从未编写过线程(我基本上使用 Albahari 作为我的指南针),但我绝对想这样做,所以我有几个问题只是为了提前发现可能的严重头痛:
- Q1.如果主进程仅写入而新进程仅取消队列项目,我可能会在队列上遇到并发问题吗?换句话说:在这种情况下,同步是一个重要问题吗?
- Q2。我已经看到我可以从头开始创建一个新线程,或者可以重用现有池中提供的线程之一。在这种情况下使用池中的线程更安全/更简单吗?
- Q3。无限期地保持新线程活动并仅响应计时器直到主进程关闭是否有任何缺点?
如果您的目标是 .Net Framework 4,阻塞收集 http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT听起来它会解决你的问题;即,当“工作”项在队列上可用时(添加新文件时添加到事件处理程序上的队列),创建一个新的线程池线程,并在该线程上异步处理它们。
您可以在生产者/消费者队列中使用一个队列:
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();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)