gpt4 book ai didi

c# - Parallel.ForEach仅在未运行代码时才在启动时执行两次吗?

转载 作者:行者123 更新时间:2023-12-03 13:20:51 24 4
gpt4 key购买 nike

我正在尝试使用Parallel.ForEach生成唯一的定时线程的Windows服务。问题是,如果我在VS中将代码搁置几个小时,或者如果我停止服务几个小时并启动任何备份,则初始启动代码将执行两次。这是该服务的OnStart调用的静态void的摘录。

Parallel.ForEach(urls, url =>
{
PageGrabber pagegrab = new PageGrabber(url);
if (url.Type.ToLower() == "http")
{
pagegrab.Elapsed += (obj, e) =>
{
pagegrab.CheckNormal();
};
pagegrab.CheckNormal();
}
else
{
pagegrab.Elapsed += (obj, e) =>
{
pagegrab.CheckXML();
};
pagegrab.CheckXML();
}
}
);

如果我直接使用Threads,这很有用,但我确实想稍微更新一下此代码。重复执行立即发生。 PageGrabber对象非常简单,因为它仅使用WebClient下载HTML或XML作为字符串,这很无聊。

最佳答案

我认为问题在于您已通过Elapsed订阅了pageGrabber.Elapsed +=...事件
该事件可能会引发,也可能不会引发。
因此,在某些情况下,如果引发了该事件,则您的方法将被调用两次,否则将被调用一次。

我认为您无法通过更改并行实现(使用任务数组而不是Parallel.Foreach)解决此问题。这可能会导致问题发生的频率降低,这在并行编程中是非常严重的症状。您不应该通过使发生困难的先决条件让问题逐渐消退!您应该将其完全删除!

关于c# - Parallel.ForEach仅在未运行代码时才在启动时执行两次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com