处理任务时额外调用 mscorlib.ni 是什么?

What is the extra call mscorlib.ni when working with tasks?

这是我的测试代码

    class Program
    {
        static void Main(string[] args)
        {
            for (var i = 0; i < 1000 * 1000 * 1000; i++)
            {
                if (i%1000 == 0)
                {
                    var someIntTask = GetTaskInt(i);
                    var someInt = UnwrapResult(someIntTask);
                }
            }
        }

        private static int UnwrapResult(Task<int> someIntTask)
        {
            return someIntTask.Result;
        }

        static Task<int> GetTaskInt(int seed)
        {
            return Task.FromResult(seed + 10);
        }
    }

非常简单。当我使用 VS2015 分析器时,结果如下所示:

有人打电话给 mscorlib.ni.dll。请注意,代码仅在 i%1000 == 0.

条件下与任务一起使用

当我使用条件 i%10 == 0 时,结果会变成这样:

这意味着,额外的调用在某种程度上与任务相关,因为花费的时间与处理任务的时间相关。

mscorlib.ni.dll 的后台正在做什么?

Ngened 图像没有与之关联的 PDB 文件,这就是为什么探查器无法确定正在调用 mscorlib 中的哪个方法的原因。但是 you can create those PDBs.

在没有生成 PDB 的情况下,我得到的结果与您的相似:

生成 PDB 并重新加载报告后,我得到:

这表明在 mscorlib 内部花费的大部分时间来自 Task.FromResult(),我认为这并不奇怪。

请注意,只有在调试模式下进行分析时,我才会得到这些结果,您永远不应该这样做。在Release模式下,结果大不相同: