【问题标题】:Thread.Yield() in coreclrcoreclr 中的 Thread.Yield()
【发布时间】:2016-04-17 07:02:23
【问题描述】:

在 .NET Thread 类中具有静态方法 Yield。
我在coreclr implementation of Thread 看到了那个方法。
documentation 不包含该方法描述。
.NET CLI(dotnet build)也无法使用该方法调用编译代码。
为什么?

更新
运行: 1.0.0-rc1-update1 coreclr x64 darwin

项目.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 中缺少某些框架功能。

【问题讨论】:

  • 这取决于您的项目的框架、平台以及项目的配置方式。能否提供你使用的代码示例和project.json?
  • 我要绕开一点——你为什么认为你需要使用Thread.Yield?我很确定有比使用Thread.Yield 更好的方法来完成您正在做的任何事情,尤其是当您以coreCLR 为目标时。
  • 法比恩,我已经编辑了问题
  • Luaan,我刚刚注意到当在 Thread.我不会用它。而且,我找不到 Process 类,我想这个问题的答案有助于我理解原因。

标签: c# .net multithreading coreclr


【解决方案1】:

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

注意它是特殊的,它只包含声明。它是参考程序集,你的编译器使用的那个。如您所知,它没有 Yield() 方法,因此可以保证 eek!从编译器。在 GAC 中区分参考程序集和实现程序集是很久以前发生的事情,请查看 Windows 机器上的 C:\Program Files (x86)\Reference Assemblies 目录。

省略成员或类型的确切原因并不总是很明显。据我所知,起作用的因素有:

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

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

  3. .NET 团队想要弃用它,CoreFx 是一个很好的机会来砍掉一些枯木或追求新的最佳实践。很多这样的例子,String.GetEnumerator() 是一个通常难倒程序员的例子,我从一个团队成员那里听到它不够高效的理由。 ArrayList 等过时的 .NET 1.x 类更为明显。

我不能确定为什么 Thread.Yield() 会掉到地上,但它在 CoreCLR 实现(YieldProcessor 和 __SwitchToThread)中被大量使用,因此它符合第 3 条。微软一直在努力使他们的操作系统和框架对移动设备更友好,在这种平台上他们没有很好地竞争。线程绝对不友好。

他们希望您使用 Task.Yield() 的可能性很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2012-07-13
    • 2012-04-03
    • 2014-07-02
    • 2012-12-26
    • 1970-01-01
    • 2015-07-01
    • 2011-02-26
    相关资源
    最近更新 更多