可能不需要循环,也不确定是否需要并行。如果您想处理一批新文件,这将很有用。
将出现新文件的文件夹上的 FileSystemWatcher 将为您提供将文件添加到队列的事件。
为添加到队列的项目添加事件,以触发线程处理单个文件。
如果你敲出一个简单的类、文件、状态、检测到的时间等。
您将有一个检测线程添加到队列中,一个线程池来处理它们,并在成功时将它们从队列中删除。
您可能会发现上一个问题在 .net 4 中对 threasafe “列表”很有用
Thread-safe List<T> property
特别是如果您想处理自 X 以来的所有新文件。
请注意,如果您不打算使用 FileSystem 观察程序而只从文件夹中获取文件,则将它们移动到已处理的文件夹以及可能的失败文件夹将是一个好主意。读取 200,00 个文件名以检查您是否已处理它们,这会消除并行处理它们的任何好处。
即使你这样做,我也会推荐它。只需将其移回 To Process(或在失败的情况下进行编辑后)将触发它被重新处理。另一个优点是,如果您正在处理一个数据库,并且一切都顺利进行,并且您的最后一次备份是在 X 上。您可以还原,然后只需将您处理过的所有文件移回“toprocess”文件夹。
您还可以使用已知输入进行测试运行,并在前后检查数据库的状态。
进一步评论。
Task 使用的 ThreadPool 有一个 ThreadPool 限制,适用于您应用中的所有任务或后台任务。
评论后。
如果要限制并发任务的数量...
十个初学者,您可以轻松改进,用于调整和提升。
在您管理从文件队列中启动任务的类中,例如
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?");
}
}
}
简单而安全(我认为)。您也可以让另一个属性暂停或禁用以进行检查。可能想让上面的单例( :( ),或者至少要记住,如果你运行多个......
我能给出的最好建议是从简单、开放和解耦开始,然后根据需要进行复杂化,在这里过早地开始优化很容易。一个好主意不要让所有线程都在等待文件系统或后端,但我怀疑处理器的数量是否会成为瓶颈,所以你的 maxTasks 有点悬而未决。
在下限和上限之间进行某种自我调整可能是一件好事,而不是一个固定的数字。