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

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

当我检查基本上类似于下面的代码段的代码时,我看到在试图命名 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/

10-13 07:46
查看更多