任务工厂是顺序的,而不是并行的



我不是线程专家,但我想一次并行运行一个函数 N 次,如果需要,在可用时使用多个内核。

我目前有波纹管代码:

tasks = new List<Task>();
for (int i = 0; i < _runThreads; i++)
{
    tasks.Add(Task.Factory.StartNew(() =>
    {
        GetRSS();
    }, stopAllTasks.Token));
}

获取RSS示例:

private void GetRSS()
{
    while (!queue.IsEmpty)
    {
        int total = 0;
        // dequeue, get url bla bla
        using (WebClient client = new WebClient())
        {
            //some code here get html content
        }
        // parse the rss bla bla
        // get the count of total items found 
        // update total variable with the total
        Interlocked.Add(ref counter, total);
    }
}

如您所见,在 GetRSS 代码中,我正在用每页获得的总条目数更新counter,当我的计时器滴答作响时,它会将计数器的值更新为标签,以便我可以看到进度。

由此,我注意到任务不是一次全部工作,但它们实际上是 1 个工作,因为计数器只更新 X 量,这相当于运行单个函数。

因此,从那里我相信上面的代码实际上并没有并行运行任务,但它们似乎按顺序运行它。

  • 是吗?

  • 如果是这样,我如何转换我的代码,使其实际并行运行?

你的代码绝对应该并行运行。在这里查看类似的问题。

此外,您可能会面临连接限制,这就是为什么您可以认为它是按顺序运行的。您可以使用配置来覆盖它:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.net>
        <connectionManagement>
            <add address="*" maxconnection="<some reasonable number here>" />
        </connectionManagement>
    </system.net>
</configuration>

相关内容

  • 没有找到相关文章

最新更新