可能不需要循环,不确定并行是必要的。如果你想处理一批新文件,这将很有用。 FileSystemWatcher将显示新文件的文件夹,将为您提供将文件添加到队列的事件。
为添加到队列中的项目添加事件,以触发线程处理单个文件。
如果你敲了一个简单的类,文件,状态,检测时间等
你就会有一个检测线程加入队列,线程池来处理它们并成功从队列中删除它们。
你可能在.net中发现这个问题以前有用threasafe“名单” 4
Thread-safe List<T> property
特别是如果你要处理所有的新文件,因为X.
注意,如果你不要使用FileSystem观察器,只需从文件夹中获取文件,将Processed文件夹移动到文件夹以及Failed文件夹中,这将是一个好主意。读取200,00个文件名以检查是否已经处理它们将会从并行处理中移除任何好处。
即使你这样做,我也会推荐它。只要将它移回到“处理”(或在发生故障时进行编辑后)将触发它进行重新处理。另一个优点是,如果您正在处理数据库,并且所有内容都会变成乳头状态,并且最后一次备份是在X.您可以恢复,然后将所有已处理的文件移回“toprocess”文件夹。
您也可以使用已知输入执行测试运行并检查db的状态前后。
进一步评论。
Task使用的ThreadPool有一个ThreadPool限制,用于yor应用程序中的所有for或后台任务。
评论后。
如果要限制并发任务数...
入门十年,你可以很容易地在,完善调整和提升。
在你的班级管理从文件队列蹬掉的任务,像
private object _canRunLock;
private int _maxTasks;
private int _activeTasks;
public MyTaskManager(int argMaxTasks)
{
_maxTasks = argMaxTasks;
_canRunLock = new object();
_activeTasks = 0;
}
public bool CanRunTask(MyTask argTask)
{
get
{
lock(_canRunLock)
{
if (_activeTasks < _maxTasks)
{
ExecuteTask(argTask);
_activeTasks++;
return true;
}
}
return false;
}
}
public void TaskCompleted()
{
lock(_canRunLock)
{
if (_activeTasks > 0)
{
_activeTasks--;
}
else
{
throw new WTFException("Okay how did this happen?");
}
}
}
简单,安全的(我认为)。你可以有其他的属性暂停或禁用以及检查。可能想要使上面的单身人士(:(),或至少要记住,如果你运行多个... ...
我可以给的最好的建议是开始简单,开放和解耦,然后必要时复杂化,很容易在这里过早地开始优化,一个好主意不要让所有等待的线程都说FileSystem或者后端,但是我怀疑处理器的数量是否会成为瓶颈,所以你的。为MaxTasks在空气有点拇指 一些不大不小的下限和上限之间的自我调整的可能,而不是一个固定的数字是好事
问题是什么? – PHeiberg 2012-02-06 09:19:42
如何创建两个循环(一个用于检查文件夹和添加文件,另一个用于从队列中取文件并将它们并行处理)并添加队列以在它们之间进行通信。 – 2012-02-06 11:01:17
请编辑“问题”以实际包含问题 – PHeiberg 2012-02-06 11:41:07