处理任务时额外调用 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模式下,结果大不相同:
这是我的测试代码
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模式下,结果大不相同: