C# 任何.NET Core 3.0项目都会不断产生一个线程,这会损害我的运行时性能

C# 任何.NET Core 3.0项目都会不断产生一个线程,这会损害我的运行时性能,c#,.net,.net-core,C#,.net,.net Core,我正在使用.NETCore3.0上的OpenTK编写一个3D渲染器。我遇到了一个问题,我的游戏会有这些小的“微秒”暂停,我会得到一个非常小的快速运动,可能会持续50-100毫秒。这很烦人,每10-20秒发生一次 我发现了导致它们的三个问题,并消除了其中两个。最后一个问题我不知道怎么解决 在调试模式下查看输出窗口后,我注意到微控制器似乎总是与以下记录一致: The thread 0x4f1e has exited with code 0 (0x0). 其中线程ID将发生变化 我的目标是摆脱任何正

我正在使用.NETCore3.0上的OpenTK编写一个3D渲染器。我遇到了一个问题,我的游戏会有这些小的“微秒”暂停,我会得到一个非常小的快速运动,可能会持续50-100毫秒。这很烦人,每10-20秒发生一次

我发现了导致它们的三个问题,并消除了其中两个。最后一个问题我不知道怎么解决

在调试模式下查看输出窗口后,我注意到微控制器似乎总是与以下记录一致:

The thread 0x4f1e has exited with code 0 (0x0).
其中线程ID将发生变化

我的目标是摆脱任何正在产生这些。。。但是,即使是在一个控制台应用程序中,它们似乎也在发生,这个应用程序只会永远循环如下

using System;

namespace ThreadStutterTestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            while (i <= 0)
            {
                i = -1;
            }
        }
    }
}
使用系统;
名称空间ThreadStutterTestApp
{
班级计划
{
静态void Main(字符串[]参数)
{
int i=0;

虽然(我我也遇到过这种情况,但在我一直在做的一个游戏中,我遇到了完全相同的“神秘线程退出”,这似乎是由任何不可预测的因素造成的,这将导致游戏的“弹出”和“结巴”每隔几秒钟,有时会被输入影响,有时它会自己发生,但它总是与“神秘线程出口”配对。我拔出头发,我正在考虑像切换游戏框架那样激烈的事情,甚至把我的代码从C++到C ++。 但是经过大量的研究,它似乎是JIT系统中使用的。后台线程似乎是JIT开始接受以前的JIT代码并进一步优化它,因为它被检测为大量使用。NET团队说这将在.NET 5中得到修复;但现在,他们似乎建议关闭t完全iered编译,您可以在
.csproj
文件中执行,以及其他位置:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TieredCompilation>false</TieredCompilation>
  </PropertyGroup>
</Project>

假的

当然,不利的一面是JIT的性能较差,可能生成的代码优化程度较低;但在我的例子中,它消除了意外的游戏性口吃。

口吃是发生在.NET Core 2还是2.1上?@mjwills我计划很快找到答案,但这不会是即时的,因为我必须删除所有用于制作它的C#8功能在早期版本上工作。不过,我会这样做,以发现它是否有助于解决我的问题。@mjwills Nullable引用类型不幸地在我使用core 2.1和C#7.3时出现了数百个错误,但我现在要检查并修复它们,看看是否能尽快得到一些结果。另一个想法:生成本机映像。如果这与此有关,也许AOT是解决方案。我认为在部署时生成本机映像以提高性能应该是件好事。@mjwills有趣的消息,幸运的是VS能够帮助我快速清理可为空的引用。我在.NET Core 2.1上根本没有任何微阻塞峰值(太棒了!)但不幸的是,它们确实存在于.NETCore2.2(以及3.0)上。看起来是2.2中引入了导致这种情况的原因。