我有一些使用消息的使用者。根据该消息,我必须为每条消息执行3种类型的异步操作(.net Task - TPL
)。对于执行这些任务之前的每条消息,我必须执行另一个任务,例如StartingDownloadMap
和FinishedDoenloadMap
。但是,有这样的约束:
1)只能同时执行10个任务(相同类型)。
2)对于任何一个任务,如果输入参数相同,我们可以使用已执行或已注册的任务。例如:
- Message1 -> England
- Message2 -> Italy
- Message3 -> Brazil
比方说,这3个任务之一称为DownloadEuropeMapPng
。假设这个过程将花费30秒。在这种情况下,如果我正在为DownloadEuropeMapPng
消息执行England
,并且2秒钟后收到一条新消息(例如:意大利),则必须在已经执行下载任务的情况下附加新消息过程。
为了满足这些要求,我创建了这样的字典:Dictionary。我正在使用.ContinueWith
并注册要执行的新任务。而且我有if
块来检查我是否正在运行10个任务以进行指定类型的操作。 (第一个约束)这些任务执行完毕后,我将从字典中将其删除。
使用如此繁重的任务不好吗?可能有问题吗?因此,如果我可以同时说1000条消息。我可能会创建3000个任务,但其中只有30个将同时运行。否则我将有一堆注册的继续回调,这些回调将在一段时间后执行。
除了消耗更多的内存外,我认为拥有许多任务对象没有什么错。如果需要限制并发性,则可以通过创建自定义任务计划程序(例如示例here),以更简单的方式来实现。
或者,您也可以看到Parallel.ForEach并指定MaxDegreeOfParallelism。