具有计时器和有限数量的任务的Windows服务

时间:2014-02-26 13:46:38

标签: c# multithreading task-parallel-library async-await

我有事要做,我不确切知道如何。

已经在做什么:
我有一个带有System.Timers.Timer的Windows服务,每5秒运行一次。

我知道该怎么做:
这个计时器应该检查一个目录(没问题),如果有一个文件,它应该为每个文件启动一个Action,它执行一些东西,一个是启动一个应用程序。
此操作的第一行是将文件移动到临时目录,并且在此应用程序结束成功之后我必须从临时文件夹中删除该文件(通常一切都没问题)

问题是什么:
我必须同时将此动作限制为10。 如果可能的话,我想使用新的Action和Task东西而不是ThreadPool和Thread。

那么,我该如何做到这一点?
我知道有:

Parallel.Invoke(new ParallelOptions { MaxDegreeOfParallelism = 10 }, actions);

但是如何确保每个文件/操作只处理一次?
例如,定时器已用事件触发,有12个文件,我向List添加12个动作并调用此Parallel.Invoke,10个动作正在运行,4个已完成,然后再次定时器已用事件被触发20个新文件,再次将20添加到列表,现在包含28个操作,并再次添加Parallel.Invoke?!
然后第一个计时器运行的未完成的动作将被执行两次,对吧?

有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

这不是一个明确的问题,但是生病了:

请勿使用Parallel.Invoke并丢失计时器。拥有TaskTask.Run)且其中包含while,并在其中使用Task.Delay(5000)。这可确保您不会重新进入操作,如果它需要的时间超过您计划采取的操作。

在while内部只需检查文件并将“操作项”推送到TPL Dataflow的ActionBlock中,该ActionBlock异步处理每个文件(复制,删除等)。 确保将MaxDegreeOfParallelism设置为10。

这基本上会创建一个“Watcher”来填充“Pipe”并对其中的每个项目运行一个动作(这是有问题的文件)