核心CLR中的Thread.Yield()

6

.NET中的Thread类有一个静态方法Yield。
我在coreclr implementation of Thread中看到了该方法。
但是documentation没有包含该方法的描述。
同时,.NET CLI(dotnet build)无法编译带有该方法调用的代码。
为什么?

更新
运行时版本: 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": {}
    }
}

更新2
我不打算使用Thread.Yield();
我只是想知道为什么一些框架特性在coreclr中不存在。


这取决于使用的框架、平台以及项目的配置。您能提供您所使用的代码示例和project.json文件吗? - Fabien ESCOFFIER
1
我打算离题一下 - 你为什么认为需要使用Thread.Yield?我非常确定有比使用Thread.Yield更好的方法来完成你要做的事情,尤其是当你的目标是coreCLR时。 - Luaan
Fabien,我已经编辑了这个问题。 - mif
Luaan,我刚刚注意到当按下Thread后按ctrl + space时,我不会使用它。但是,我找不到Process类,我认为这个问题的答案会帮助我理解为什么。 - mif
1个回答

5
您正在查看错误的文件,正确的文件在corefx存储库中。请点击这里查看正确的文件。
需要注意的是,这个文件非常特殊,它只包含声明。这是一个“引用程序集”,也就是编译器使用的程序集。正如您所看到的,它没有Yield()方法,因此会导致编译器出错。在GAC中区分引用程序集和实现程序集是很久以前的事情了,请查看Windows机器上的C:\Program Files (x86)\Reference Assemblies目录。
为什么某些成员或类型被省略的确切原因并不总是显而易见。从我所看到的情况来看,影响因素包括:
1. .NETCore版本的CLR根本不支持该类型或成员。最初设计为针对移动设备和易于下载的CLR的小版本,Silverlight是该系列中最具代表性的成员。由于小型还使得将CLR移植到另一个平台变得更加容易,因此.NETCore作为CoreCLR的引导程序而存在,因为让它在Linux和OSX上运行是一个强烈的目标。AppDomain就是一个很好的例子。
2. 它可能还没有在每个操作系统上实现,或者它在错误的.NETStandard配置文件中。将其排除在引用程序集之外是防止程序意外使用它并触发可能非常难以诊断的运行时异常的非常简单的方法。
3. .NET团队希望废弃它,CoreFx是削减一些死木或追求新最佳实践的绝佳机会。这方面有很多例子,String.GetEnumerator()通常会使程序员困惑,我从一个团队成员那里听到的理由是它不够高效。过时的.NET 1.x类,如ArrayList,更为明显。
我无法确定为什么Thread.Yield()被省略了,但它在CoreCLR实现中被大量使用(YieldProcessor和__SwitchToThread),因此很可能符合第三点。微软一直在努力使他们的操作系统和框架更加适合移动设备,而这种平台并不是他们的强项。线程绝对不友好。
很有可能他们希望您使用Task.Yield()代替。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接