c# - 在 Parallel.Invoke 中命名线程会导致异常 "This property has already been set and cannot be modified."

标签 c# threadpool parallel-extensions

我有一个应用程序,它运行了很长时间没有问题,由于以下错误突然无法启动:

“该属性已经设置,无法修改。”

当我检查基本上类似于下面的代码片段的代码时,我看到在试图命名 Parallel.Invoke 中的第一个任务的行上抛出了异常

Thread.CurrentThread.Name = "Main Program Thread";

// Do some start up tasks in parallel
Parallel.Invoke(new ParallelOptions { MaxDegreeOfParallelism = 10 },
() =>
{
    Thread.CurrentThread.Name = "First thread";
},
() =>
{
    Thread.CurrentThread.Name = "Second thread";
});
                        ...

很明显,原因肯定是主线程已经有了名字,第一个任务是在主线程而不是线程池线程上运行。

虽然我可以通过不在 Parallel.Invoke 中命名线程来解决这个问题,但我很好奇为什么这突然开始发生。通常情况下 Parallel.Invoke() 以前在线程池线程上运行它的所有任务并且由于某种原因不能再这样做了吗?什么可以触发这种事情?

我越看这段代码就越感到困惑,因为它曾经有效过。在我看来,这段代码应该总是抛出异常。

最佳答案

Parallel 通常在线程池上运行一些工作,在当前线程上运行一些工作,以免让它闲置。这并不能保证,所有工作都可以在当前线程上的池上运行。

我不知道为池线程分配名称时会发生什么。它要么抛出,要么什么都不做,要么只工作一次。这些都不可取。

丢弃此代码。不要乱用你不拥有的线程。

您可以使用 LongRunning 任务选项来获取您可以配置的专用线程。

关于c# - 在 Parallel.Invoke 中命名线程会导致异常 "This property has already been set and cannot be modified.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31452298/

相关文章:

c# - 如何尝试..catch ThreadPool.QueueUserWorkItem 代码

c# - 在多个 IQueryable 上并行运行相同的 linq 查询?

c# - 并行扩展

c# 如何 FormWindowState.Normal

c# - 在特定元素之前将元素添加到列表

c# - 希伯来语、英语、符号的正则表达式

c# - 使用 'using' 而不是关闭 WebResponse 和 StreamReader 是否安全

ruby - 我如何管理 ruby​​ 线程以便它们完成所有工作?

go - 是否可以在不同的用户下运行 goroutine 或 go 方法?

多核上的 Java 并行执行