我有一个函数,我试图在一个并行的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中调用函数。
答案 0 :(得分:1)
一个常见的错误是,尽管对象是线程安全的,但集合不是。
因此,在枚举您的收藏夹时,可能有人更改了收藏夹(通过添加[或更糟糕的是:删除]项目)。
这会产生有害的副作用,并使其成为线程不安全的。
此外:
没有足够的信息来回答您的问题。这些“意外结果” 是什么,也许WriteSiteCollection
根本不是线程安全的。所以也许您可以向我们展示这段代码。