coreclr中的Thread.Yield()

时间:2016-04-17 07:02:24

标签: c# .net multithreading coreclr

在.NET中,Thread类具有静态方法Yield 我在coreclr implementation of Thread中看到了这种方法 但documentation并未包含该方法说明 .NET CLI(dotnet build)也无法使用该方法调用来编译代码 为什么呢?

UPD
运行: 1.0.0-rc1-update1 coreclr x64 darwin

project.json

{
    "version": "1.0.0-*",
    "compilationOptions":
    {
        "emitEntryPoint": true
    },
    "dependencies":
    {
        "NETStandard.Library": "1.0.0-rc2-*",
        "System.Threading": "4.0.11-rc3-*"
    },

    "frameworks": {
        "dnxcore50": {}
    }
}

UPD2
我不打算使用Thread.Yield();
我只是想知道为什么coreclr中没有一些框架功能。

1 个答案:

答案 0 :(得分:5)

您正在查看错误的文件,正确的文件位于corefx存储库中。 This one

请注意,它是特殊的,它只包含声明。它是引用程序集,是编译器使用的那个。你可以告诉它,它没有Yield()方法所以保证eek!来自编译器。将参考程序集与GAC中的实现程序集区分开来是很久以前发生的事情,请查看Windows计算机上的C:\ Program Files(x86)\ Reference Assemblies目录。

省略成员或类型的确切原因并不总是显而易见的。从我所看到的,发挥作用的因素是:

  1. CLR的.NETCore版本根本不支持类型或成员。 Silverlight最初设计为针对移动设备的小型CLR,易于下载,是该系列中最知名的成员。由于使用较小的附加功能也可以更轻松地将CLR移植到另一个平台,因此.NETCore可以作为CoreCLR的引导程序,因为它可以在Linux和OSX上运行,这是一个强大的目标。 AppDomain就是一个很好的例子。

  2. 它可能尚未在每个操作系统上实现,或者它位于错误的.NETStandard配置文件中。将它保留在引用程序集之外是一种非常简单的方法,可以防止程序意外使用它并触发可能非常难以诊断的运行时异常。

  3. .NET团队想要弃用它,CoreFx是削减一些死木或追求新的最佳实践的绝佳机会。很多这样的例子,String.GetEnumerator()通常会让程序员难以接受,我从团队成员那里听到的理由是它不够高效。像ArrayList这样过时的.NET 1.x类更为明显。

  4. 我无法确定为什么Thread.Yield()落在了地板上,但它在CoreCLR实现(YieldProcessor和__SwitchToThread)中被大量使用,因此很有可能它适合子弹3.微软一直在努力推动他们的操作系统和框架对移动设备更加友好,这是他们没有竞争的平台。线程绝对不友好。

    他们希望您使用Task.Yield()的好几率。