首页 > 解决方案 > 达到限制时在所有线程上停止 Parallel.For 吗?

问题描述

我正在尝试获取用户在其个人资料中发布的所有图像。我使用 API 执行此操作,该 api 最多显示用户发布的 50 条最新帖子。要获得超过 50 个页面,您需要调用第二个页面,每个页面有 50 个,因此如果您想要最后 200 个页面,请运行 4 个页面。

我开始为此使用并行,否则需要很长时间。我要问的问题是,有没有办法完全阻止平行线的每一次互动,因为一旦它达到没有更多图像可以收集的阶段?

正如你从下面看到的,我有一个待办事项。现在我可以摆脱它了,但有些互动比他们需要的更进一步,实际上很多。一旦任何并行部分达到没有更多图像要收集的限制,有没有办法停止所有交互?

public List<TumblrFile> GetImagesForAddress(string pageAddress, string saveLocation)
{
    var imageUrls = new List<TumblrFile>();

    Parallel.For(0, _pageCount,
    index => {
        var document = XDocument.Load(GetApiLink(pageAddress, index * 50, true));
        var newImages = XmlUtilities.ExtractImagesFromDocument(document, saveLocation);

        if (newImages.Count < 1)
        {
            // TODO: Stop this loop
        }

        foreach (var newImage in newImages)
        {
            if (imageUrls.All(x => x.Address != newImage.Address))
            {
                imageUrls.Add(newImage);
            }
        }
    });

    return imageUrls;
}

标签: c#.net

解决方案


并行有一个重载,看起来像这样

Parallel.For(0, pageCount, (index, loopState) =>

使用它,当你想打破说 loopState.Stop();


推荐阅读