Thread.Yield() 在 coreclr 中
Thread.Yield() in coreclr
在 .NET Thread class 中有静态方法 Yield。
我在 coreclr implementation of Thread.
中看到了那个方法
但是 documentation 不包含该方法描述。
.NET CLI(dotnet 构建)也无法使用该方法调用编译代码。
为什么?
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 中缺少某些框架功能。
您看错了文件,正确的文件在 corefx 存放处。 This one.
注意它比较特殊,它只包含声明。它是 参考程序集 ,您的编译器使用的那个。正如您所知道的,它没有 Yield() 方法,所以可以保证!来自编译器。在GAC中区分引用程序集和实现程序集是很久以前的事情了,看看Windows机器上的C:\Program Files (x86)\Reference Assemblies目录
省略成员或类型的确切原因并不总是很明显。据我所知,影响因素有:
.NETCore 版本的 CLR 根本不支持该类型或成员。 Silverlight 最初设计为针对移动设备且易于下载的 CLR 的小型版本,是该家族中最知名的成员。凭借小的附加功能还可以更轻松地将 CLR 移植到另一个平台,.NETCore 成为 CoreCLR 的 bootstrap,因为它在 Linux 和 OS 上成为 运行 X 是一个强有力的目标。 AppDomain 就是一个很好的例子。
它可能还没有在每个 OS 上实现,或者它在错误的 .NETStandard 配置文件中。将它排除在参考程序集之外是一种非常简单的方法,可以防止程序意外使用它并触发可能很难诊断的 运行 时间异常。
.NET 团队想要弃用它,CoreFx 是一个绝好的机会来削减一些陈旧的木材或追求新的最佳实践。很多这样的例子,String.GetEnumerator() 是一个通常难倒程序员的例子,我从一个团队成员那里听到的理由是它不够有效。过时的 .NET 1.x 类 像 ArrayList 更明显。
我不确定为什么 Thread.Yield() 掉在地上,但它在 CoreCLR 实现(YieldProcessor 和 __SwitchToThread)中被大量使用,所以它适合第 3 条. 微软一直在努力使他们的操作系统和框架对移动设备更加友好,他们在这种平台上没有很好的竞争。跟帖肯定不友好
很有可能他们希望您改用 Task.Yield()。
在 .NET Thread class 中有静态方法 Yield。
我在 coreclr implementation of Thread.
中看到了那个方法
但是 documentation 不包含该方法描述。
.NET CLI(dotnet 构建)也无法使用该方法调用编译代码。
为什么?
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 中缺少某些框架功能。
您看错了文件,正确的文件在 corefx 存放处。 This one.
注意它比较特殊,它只包含声明。它是 参考程序集 ,您的编译器使用的那个。正如您所知道的,它没有 Yield() 方法,所以可以保证!来自编译器。在GAC中区分引用程序集和实现程序集是很久以前的事情了,看看Windows机器上的C:\Program Files (x86)\Reference Assemblies目录
省略成员或类型的确切原因并不总是很明显。据我所知,影响因素有:
.NETCore 版本的 CLR 根本不支持该类型或成员。 Silverlight 最初设计为针对移动设备且易于下载的 CLR 的小型版本,是该家族中最知名的成员。凭借小的附加功能还可以更轻松地将 CLR 移植到另一个平台,.NETCore 成为 CoreCLR 的 bootstrap,因为它在 Linux 和 OS 上成为 运行 X 是一个强有力的目标。 AppDomain 就是一个很好的例子。
它可能还没有在每个 OS 上实现,或者它在错误的 .NETStandard 配置文件中。将它排除在参考程序集之外是一种非常简单的方法,可以防止程序意外使用它并触发可能很难诊断的 运行 时间异常。
.NET 团队想要弃用它,CoreFx 是一个绝好的机会来削减一些陈旧的木材或追求新的最佳实践。很多这样的例子,String.GetEnumerator() 是一个通常难倒程序员的例子,我从一个团队成员那里听到的理由是它不够有效。过时的 .NET 1.x 类 像 ArrayList 更明显。
我不确定为什么 Thread.Yield() 掉在地上,但它在 CoreCLR 实现(YieldProcessor 和 __SwitchToThread)中被大量使用,所以它适合第 3 条. 微软一直在努力使他们的操作系统和框架对移动设备更加友好,他们在这种平台上没有很好的竞争。跟帖肯定不友好
很有可能他们希望您改用 Task.Yield()。