【发布时间】:2023-03-24 20:27:01
【问题描述】:
我有一个函数,我试图在 Parallel 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 中的函数。
【问题讨论】:
-
我们不知道该 write 方法中的内容,但
Parallel.For是线程安全的并不意味着您调用的方法是。 -
因为我在 distinctUrls[i] 中得到 2 个值。但它只写了一个。没有并行执行的相同方法工作正常
-
i = Interlocked.Increment(ref i);为什么将其分配给i(本身)?你不应该那样做。相反,使用stackoverflow.com/a/39714239/34092 让Parallel为您处理索引生成。 -
另外,您还没有提供minimal reproducible example,因为
WriteListItems可能有类似的错误。这样想minimal reproducible example - 我可以将它复制并粘贴到控制台应用程序中并运行它吗?如果我不能 - 它可能还不是minimal reproducible example。
标签: c# multithreading c#-4.0 parallel-processing thread-safety