【问题标题】:.NET Core 2.1 EventWaitHandle Not Supported?.NET Core 2.1 EventWaitHandle 不支持?
【发布时间】:2018-11-28 19:29:18
【问题描述】:

我正在将 C# .NET Framework 项目转换为 .NET Core。它编译时没有错误或警告,并且在 Windows 上运行良好,但是当我在 CentOS 7 上尝试它时,当我尝试创建 EventWaitHandle 的实例时得到一个 System.PlatformNotSupportedException。代码如下:

this.eventHandle = new EventWaitHandle(initialState, resetMode, name);

显然 .NET Core 2.1 支持此类,因为这里有 MS 文档:

https://docs.microsoft.com/en-us/dotnet/api/system.threading.eventwaithandle.-ctor?view=netcore-2.1

这是否像错误描述的那样简单,并且不支持跨多个平台的此类?如果是这样,为什么它包含在 .NET Core 中?这里还能有其他什么东西在起作用吗?

如果根本不支持,是否有人可以建议在 .NET Core 2.1 中完全支持的替代类?

谢谢。

【问题讨论】:

  • 你在使用任何 NuGet 包吗?
  • 添加更多信息...我正在使用它进行跨进程同步。
  • @Moffen,我目前没有使用任何 NuGet 包。
  • 显而易见的方法可能是创建一个拉取请求,以便 events are implemented in a POSIX or at least Linux way,然后 .NET Core 2.2 将获得支持......显然,并非完全微不足道。根据您的场景(即没有太多事件,没有太多调用),您可以通过轮询文件来实现一些穷人的同步机制。
  • 嘿@mojoker 你有没有找到解决方案?好像还没修好。

标签: c# .net-core


【解决方案1】:

.Net Core 有一些特定于平台的 api。这是其中之一。就是它不能处理的命名句柄,见source

    public EventWaitHandle(bool initialState, EventResetMode mode, string name)
    {
        if(name != null)
        {
#if PLATFORM_UNIX
            throw new PlatformNotSupportedException(Environment.GetResourceString("PlatformNotSupported_NamedSynchronizationPrimitives"));
#else
            if (System.IO.Path.MaxPath < name.Length)
            {
                throw new ArgumentException(Environment.GetResourceString("Argument_WaitHandleNameTooLong", name));
            }
#endif
        }

        ...

一些更有趣的阅读here

我不确定您应该改用哪种 .NET 技术。如果不需要跨进程同步,则不需要为 EventWaitHandle 指定名称,也可以使用不同的 EventWaitHandle 子类,例如 ManualResetEvent 或 AutoResetEvent。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2018-11-20
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多