Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Parallel.Invoke中命名线程会导致异常;此属性已设置,无法修改;_C#_Threadpool_Parallel Extensions - Fatal编程技术网

C# 在Parallel.Invoke中命名线程会导致异常;此属性已设置,无法修改;

C# 在Parallel.Invoke中命名线程会导致异常;此属性已设置,无法修改;,c#,threadpool,parallel-extensions,C#,Threadpool,Parallel Extensions,我有一个应用程序,它已经运行了很长一段时间没有出现问题,由于以下错误,它突然无法启动: “此属性已设置,无法修改。” 当我检查代码(基本上类似于下面的代码段)时,我看到异常被抛出到尝试在Parallel.Invoke中命名第一个任务的行上 Thread.CurrentThread.Name = "Main Program Thread"; // Do some start up tasks in parallel Parallel.Invoke(new ParallelOptions { Ma

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

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

当我检查代码(基本上类似于下面的代码段)时,我看到异常被抛出到尝试在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
任务选项获取可配置的专用线程。

线程池线程被重用。运行线程池任务的线程不属于您。你所做的是明令禁止的,所以当它在你脸上爆炸时,不要感到惊讶


除此之外,
Parallel.Invoke
在调用它的同一线程上运行它的一些代码时,完全在它的合理操作参数范围内-没有必要只等待所有其他线程完成,浪费一个非常好的线程。

我卸载了.NET 4.6,这段代码又开始工作了。必须有一个并行优化。在框架的较新版本中调用,它暴露了我们代码中以前从未出现过的bug

您是否在
任务
中执行了上述代码?如果是,则不能保证
Parallel.Invoke
将在不同的线程中执行操作。Parallel.Invoke作为应用程序启动的一部分从主线程调用。在Parallel.Invoke内部有许多任务,它们执行应用程序初始化所需的操作(从数据库读取缓存等)。您可能安装了.net 4.5,它们“修复”了并行扩展。@JMc查看第337-363行。在第357行中,您对任务调用
Wait
。根据,当你在
WaitingToRun
状态下调用
wait
执行任务时,可能会导致你的情况。我刚刚回忆起我在一周内下载了VS 2015 RC,尽管我没有通过该版本的VS构建或运行此应用程序。有没有想过这是否是一个潜在原因?它已经在我的机器上安装了.Net Framework v4.6….“您所做的是明确禁止的”-这在哪里是明确禁止的?另外,我没有写这段代码,我只是维护它,但这不是我的问题。我已经运行了数百次代码,但从未见过此异常。在过去的两年里,代码每天都在生产中运行,从未出现过这种异常,我的问题是,会发生什么变化来触发我现在看到的行为?这个应用程序(实际上是它的两个独立实例)已经运行了两年而没有遇到这个异常,这纯粹是愚蠢的运气吗?@JMc以“ThreadPool”的名称隐式禁止它。例如,你不会乘坐公交车去换下一辆车,因为你没有自己的车。而且,“我只维护它”并不意味着你不应该修复它。事实上,代码是非常非常错误的。我同意,我应该并将修复它。你还没有回答我的问题。它是如何工作的?为什么现在总是失败?@JMc很难说。这可能是最近的性能优化(这不会被认为是一个突破性的变化,因为您正在做不受支持的事情)。可能是一些微小的变化,这意味着初始化任务现在需要稍长(或更短)的时间,因此现在有足够的时间尝试内联运行任务。这可能是因为您过去常常同时执行更多的任务—只有在最多有四个任务/操作要调用时才会发生内联。十多项任务的行为也不同。尽量避免将来出现未定义的行为:)谢谢Luaan-我已经在其他多台机器上运行了这段代码,没有问题。这个问题只在我自己的机器上出现。我最近将电源设置从平衡更改为高性能。这可能是一个潜在的原因吗?不幸的是,恢复到平衡的权力并没有纠正这个问题。