我想实现一个类或模式,以确保我永远不会为某些操作(HTTP调用)执行超过一个任务。这些任务的调用可能来自不同的线程,并在随机时间进行。我希望利用异步等待模式,以便调用者可以通过将调用包装在try-catch中来处理异常。
这是预期执行流程的示意图:
来自调用者的伪代码:
这是预期执行流程的示意图:
![enter image description here](https://istack.dev59.com/EVlx3.webp)
try {
Task someTask = GetTask();
await SomeScheduler.ThrottledRun(someTask);
}
catch(Exception ex) {
// Handle exception
}
根据解决方案,这里的Task
类可能会被替换为一个Action
类。
请注意,当我在本问题中使用“Schedule”一词时,并不一定是针对.NET任务计划程序来使用的。我不太熟悉async-await库,不知道该如何以及用什么工具来解决这个问题。TaskScheduler可能与此相关,也可能不相关。我已经阅读了TAP模式文档,并找到了几乎解决这个问题的模式(交错章节),但还不完全符合要求。
Func<Task>
无法这样工作,因为ConcurrentExclusiveSchedulerPair
一次只允许执行一个任务,因此当async
方法使用await
时,它不再执行。如果需要阻塞直到整个async
方法完成,最好使用async
锁。 - Stephen Clearyasync
操作中使用ExclusiveScheduler
,请注意多个操作的执行可能会交错。因此,当第一个操作暂停时,第二个操作可能开始执行。但是,第一个操作的剩余部分只有在第二个操作暂停或完成后才会继续执行。如果这不是你想要的结果,可以使用带有MaxDegreeOfParallelism = 1
参数的TPL Dataflow块。 - svickasync
方法可能是多个工作单元,由await
语句分隔开。为什么不提出你自己的问题,注意避免A/B问题(即描述你正在尝试解决的实际问题)? - Stephen Cleary