【发布时间】:2019-08-14 05:25:34
【问题描述】:
我有一个IEnumerable<Task>,每个任务都会调用同一个端点。但是,端点每秒只能处理这么多的呼叫。 我怎样才能在每次通话之间延迟半秒?
我已经尝试添加 Task.Delay(),但当然等待它们只是意味着应用程序在一次发送所有调用之前等待半秒。
这是一个代码sn-p:
var resultTasks = orders
.Select(async task =>
{
var result = new VendorTaskResult();
try
{
result.Response = await result.CallVendorAsync();
}
catch(Exception ex)
{
result.Exception = ex;
}
return result;
} );
var results = Task.WhenAll(resultTasks);
我觉得我应该做类似的事情
Task.WhenAll(resultTasks.EmitOverTime(500));
...但是我该怎么做呢?
【问题讨论】:
-
在之间调用之间使用
await Task.Delay()。如果您在致电CallVendorAync()之前或之后放置它,您将得到您想要的延迟。 -
在
try子句中做的第一件事是致电Task.Delay? -
你考虑过throttling吗?
-
如果我在委托中调用(并等待)Task.Delay(),那么下一个延续会立即开始。结果是它们都在 ns 中触发了 Delay(),然后它们一起延迟了 0.5 秒,然后它们几乎同时执行。
-
@PeterWolf - 节流听起来很有希望!我会深入研究它。我发现的唯一其他限制 SO 帖子 (stackoverflow.com/questions/22492383/…) 谈到了一次最大计数,这不是我想要的。
标签: c# async-await