1

我正在开发一个 Windows 服务,我正在尝试使用 Parallel.ForEach 来生成唯一的定时线程。问题是,如果我在 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();
                        }
                    }
                    );

如果我直接使用线程,这很好用,但真的想稍微更新一下这段代码。重复执行立即发生。PageGrabber 对象非常简单,因为它只是使用 WebClient 将 HTML 或 XML 作为字符串下载 - 非常无聊。

4

2 回答 2

3

I think the problem is that you've subscribed to the Elapsed event by pageGrabber.Elapsed +=... It is possible for that event to be raised or not. So in some conditions if the event raised, your method will be called twice, otherwise it will be called once.

I don't think that you could resolve this problem by changing the parallel implementation (using task array instead of Parallel.Foreach). It just might cause the problem occur less often, which is a very bad symptom in parallel programming. You shouldn't let the problems to fade out by making their preconditions of happening harder! You should totally remove them!

于 2012-12-05T18:31:11.283 回答
0

所以 mehrandvd 是在正确的道路上。在创建使用 System.Timers.Timer 的类的实例时,它立即触发 Elapsed 事件,因为未正确设置 Interval 属性。因此:

pagegrab.Elapsed += (obj, e) =>
                        {
                            pagegrab.CheckXML();
                        };
                        pagegrab.CheckXML();

在一段时间内没有发生任何事情时导致重复执行,因为正确设置了 Interval 的类的实例不再在内存中。我的愚蠢 - 现在都解决了。感谢所有的意见和建议。

于 2012-12-29T16:44:07.753 回答