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

C# 具有计时器和有限任务量的Windows服务,c#,multithreading,task-parallel-library,async-await,C#,Multithreading,Task Parallel Library,Async Await,我有事要做,但我不知道怎么做 什么已经起作用了: 我的Windows服务带有System.Timers.Timer,每5秒运行一次 我知道怎么做: 这个计时器应该检查一个目录(没问题),如果有一个文件,它应该为每个文件启动一个操作,执行一些东西,一个是启动一个应用程序。 此操作的第一行是将文件移动到临时目录,在该应用程序成功结束后,我必须从临时文件夹中删除该文件(一般来说,一切都没有问题) 问题是什么: 我必须将此操作同时限制为10次。 如果可能,我希望使用新的操作和任务,而不是线程池和线程。

我有事要做,但我不知道怎么做

什么已经起作用了:
我的Windows服务带有System.Timers.Timer,每5秒运行一次

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

问题是什么:
我必须将此操作同时限制为10次。 如果可能,我希望使用新的操作和任务,而不是线程池和线程。

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

Parallel.Invoke(new ParallelOptions { MaxDegreeOfParallelism = 10 }, actions);
但是如何确保每个文件/操作只处理一次?
例如,计时器已过事件触发,有12个文件,我向列表中添加12个操作并调用此并行。调用,10个操作正在运行,4个操作已完成,然后再次触发计时器已过事件20个新文件,再次将20个添加到列表中,该列表现在包含28个操作,然后并行。再次调用
那么第一次运行计时器时未完成的动作就消失了,可以执行两次,对吗


有人能帮我吗?

这不是一个明确的问题,但我会尽我最大的努力:

不要使用
并行。调用
并丢失计时器。拥有一个
任务
任务。运行
),其中包含
,并在其中使用
任务。延迟(5000)
。这确保了如果需要的时间超过您计划的时间,您不会重新进入操作

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


这基本上创建了一个“观察者”,它填充一个“管道”,并对其中的每一项(即所讨论的文件)运行一个操作。

您使用信号量计数。非常感谢您,您在任何Windows服务教程中都没有看到使用过计时器!问候