相关疑难解决方法(0)

我怎样才能限制Parallel.ForEach?

我有一个Parallel.ForEach()异步循环,我下载了一些网页.我的带宽有限,所以我每次只能下载x页,但Parallel.ForEach会执行所需网页的完整列表.

有没有办法在运行Parallel.ForEach时限制线程号或任何其他限制器?

演示代码:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});
Run Code Online (Sandbox Code Playgroud)

真正的任务与网页无关,因此创意网络抓取解决方案无济于事.

.net c# asynchronous parallel.foreach

282
推荐指数
5
解决办法
14万
查看次数

如何限制每个时间的方法使用?

它必须是微不足道的,但我无法通过它.我必须限制任务量(让我们说连接,发送电子邮件或点击按钮)的时间量.所以我可以每小时发送1000封电子邮件.

我怎么能在c#中做到这一点?我不知道也不关心每次操作需要多少时间.我只是想确保在最后一小时内只执行1000次.

.net c#

13
推荐指数
1
解决办法
5014
查看次数

分区:如何在每个分区后添加等待

我有一个每分钟接受 20 个请求的 API,之后我需要等待 1 分钟才能查询它。我有一个项目列表(通常超过 1000 个),我需要从 API 查询其详细信息,我的想法是我可以用来将Partitioner我的列表划分为 20 个项目/请求,但很快我意识到这Partitioner不起作用,我的第二个想法在分区中添加 adelay但这也是一个坏主意,根据我的理解,它会在每个不需要的请求之后添加一个延迟,相反,我需要在每个Partition. 下面是我的代码:

public static async Task<IEnumerable<V>> ForEachAsync<T, V>(this IEnumerable<T> source,
    int degreeOfParallelism, Func<T, Task<V>> body, CancellationToken token,
    [Optional] int delay)
{
    var whenAll = await Task.WhenAll(
        from partition in Partitioner.Create(source).GetPartitions(degreeOfParallelism)
        select Task.Run(async delegate {
            var allResponses = new List<V>();
            using (partition)
                while (partition.MoveNext())
                {
                    allResponses.Add(await body(partition.Current));
                    await Task.Delay(TimeSpan.FromSeconds(delay));
                }
            return allResponses;
        }, token));
    return whenAll.SelectMany(x => x);
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎样才能做到这一点?

c# parallel-processing rate-limiting task-parallel-library

1
推荐指数
1
解决办法
1051
查看次数