C#:并行foreach在循环内调用函数

时间:2018-08-02 11:33:44

标签: c# multithreading c#-4.0 parallel-processing thread-safety

我有一个函数,我试图在一个并行的foreach中调用它。由于变量是线程不安全的,所以我得到了意外的结果。

,但是根据官方网站的说法:“所有Parallel的公共成员和受保护成员都是线程安全的,可以从多个线程中同时使用。”所以我不明白为什么它是线程不安全的

我第一次使用Parallel.ForEach

            Parallel.ForEach(distinctUrls, new ParallelOptions {MaxDegreeOfParallelism = executionContext.MaxDegreeOfParallelism.Value}, siteUrl =>
            {
                WriteSiteCollection (Ds, executionContext, siteUrl, stopwatch, runtime);
            });

然后我切换到Parallel.For,但是得到了相同的结果

            Parallel.For(0, distinctUrls.Count, new ParallelOptions { MaxDegreeOfParallelism = executionContext.MaxDegreeOfParallelism.Value }, i =>
            {
                WriteSiteCollection(Ds, executionContext, distinctUrls[i], stopwatch, runtime);
            });

任何提示或想法如何解决此问题。或如何在具有线程安全变量的Parallel.ForEach中调用函数。

1 个答案:

答案 0 :(得分:1)

一个常见的错误是,尽管对象是线程安全的,但集合不是。

因此,在枚举您的收藏夹时,可能有人更改了收藏夹(通过添加[或更糟糕的是:删除]项目)。

这会产生有害的副作用,并使其成为线程不安全的。


您可以根据情况,通过确保在处理过程中不能更改集合或创建其本地副本来克服此问题。


此外:

没有足够的信息来回答您的问题。这些“意外结果” 是什么,也许WriteSiteCollection根本不是线程安全的。所以也许您可以向我们展示这段代码。