我不是线程专家,但我想一次并行运行一个函数 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>