SocketAsyncEventArgs.Completed 在 Windows 8 中不会触发

2024-06-24

当我在安装了 Windows 7 Ultimate 和 .NET 4 的计算机上编译此代码时,它工作得很好,但当我在安装了 Windows 8 RTM 和 .NET 4.5 的计算机上尝试它时,Complete 事件永远不会触发。

class Program
{
    private static Socket _Socket = new Socket(
        AddressFamily.InterNetwork,
        SocketType.Stream,
        ProtocolType.Tcp);

    private static void Main(string[] args)
    {
        _Socket.Bind(new IPEndPoint(IPAddress.Any, 5012));
        _Socket.Listen(100);

        var arguments = new SocketAsyncEventArgs();
        arguments.Completed += OnAccepted;
        Accept(arguments);

        Console.ReadLine();
    }

    private static void Accept(SocketAsyncEventArgs args)
    {
        args.AcceptSocket = null;
        if (!_Socket.AcceptAsync(args))
            OnAccepted(null, args);
    }

    private static void OnAccepted(object sender, SocketAsyncEventArgs e)
    {
        Console.WriteLine("Accepted.");
        Accept(e);
    }
}

这里有趣的是,如果我在这一行放置一个断点并调试它:

var arguments = new SocketAsyncEventArgs();

并使用连接该服务器Hercules http://www.hw-group.com/products/hercules/index_en.html在继续执行之前,它就像一个魅力。我一开始就这样做,然后神奇地,OnAccepted 被调用并写入“已接受”。每个连接上的控制台。我在装有 Windows 7 和 .NET 4 的计算机上使用相同的代码和相同的程序 (Hercules),但它始终有效。

  • 难道我做错了什么?
  • 如果不是,这是否是我的操作系统或 .NET Framework 版本 4.5 的已知错误?
  • 任何人都可以复制这个吗?

Edit:两个操作系统都是 64 位。
Edit 2:我将此报告为 Microsoft Connect 上的错误,here https://connect.microsoft.com/VisualStudio/feedback/details/759913/socketasynceventargs-completed-doesnt-fire-in-net-framework-4-5.
Edit 3:找到一个解决方法并将其发布到 Connect(只需创建一个假的第一个连接)。
Edit 4:如果有人可以重现此问题,请在 Connect 中加入问题。
Edit 5: 我看到了托马斯提到的问题 https://stackoverflow.com/q/12464185/704144我测试了是否Console.ReadLine是否造成了这种情况。原来是这样。如果我添加Thread.Sleep(3000) before my Console.ReadLine运行程序后 3 秒内调用并尝试连接,它就像一个魅力。同样,奇怪的是我在打电话之前只需要这样做一次Console.ReadLine。如果我在通话前建立一个连接Console.ReadLine然后每个连续的连接都可以工作,即使在之后Console.ReadLine叫做。我会在 Connect 页面中提到这一点。
Edit 6:我将另一个问题的链接添加到“连接”页面,并添加了另一个涉及调用的解决方法Thread.Sleep打电话之前Console.ReadLine就像我在上面的编辑中提到的那样。


事实证明这是 Windows 8 的一个错误。到目前为止我能找到的最佳解决方法是在不同的线程上启动 IOCP 操作。

因此,我应该在问题中给出的代码示例中做的事情是更改这一行:

Accept(arguments);

到这一行Main method:

Task.Run(() => Accept(arguments)).Wait();

这可以防止Console.ReadLine()调用来阻止 IOCP 操作。

As a side note: This is just a workaround to an operating system bug which will most likely be fixed via an update and -hopefully- making this workaround redundant.

最新版本的 Windows 8 已修复此问题。


Edit:的现状我在 Connect 中发布的反馈项目 https://connect.microsoft.com/VisualStudio/feedback/details/759913更改为“按设计”。
我还收到了一封电子邮件,其中包含以下内容:

此行为的根本问题与 IO 的方式有关 完成端口在 Windows 8 中处理。.NET 使用 完成端口;当他们的行为改变时,.NET 也随之改变 行为。

Edit 2:反馈状态再次更改为“有效”,但没有详细信息。

Edit 3:该反馈得到了微软的另一个答复,表示:

最新版本的 Windows 8 应该已修复此问题。请注意,这是操作系统问题,而不是 .NET 问题:您需要确保拥有最新版本的操作系统。没有对 .NET 进行任何更改来导致或解决此问题。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SocketAsyncEventArgs.Completed 在 Windows 8 中不会触发 的相关文章

  • 如何创建一个 linq 查询来获取除特定值之外的所有内容

    假设我有一个 linq 查询 select r in db Roles 其中 r RoleName 不包含 Administrator select r 正是不包含部分让我感到困惑 我意识到我可以做到这一点 包含呼叫 但你如何做相反的事情
  • 设置 NLS_LANG 以进行 Oracle 管理的数据访问

    我有一个 winforms c 应用程序 通过 oracle manageddataaccess 通过 NHibernate 4 0 使用 Oracle 12c oracle 数据库位于客户站点的另一台计算机上 由于 oracle 数据库和
  • Windows 窗体数据绑定 DisplayMember 自定义类的子属性

    我正在尝试将 Windows 窗体项目中的 ListBox 的 DisplayMember 属性设置为我绑定到的通用列表内的嵌套类的属性 这是一个简单的例子 public class Security public int Security
  • 将 UTF8 字符串解码为拉丁文

    我正在尝试将 UTF8 字符串转换为拉丁字符 这是我如何尝试实现此目标的示例 string sUnicode Peneda Ger s string result Encoding Unicode GetString Encoding Co
  • 记录 NHibernate SQL 查询

    有没有办法在我的代码中访问完整的 SQL 查询 包括值 我可以使用 log4net 记录 SQL 查询
  • 支持 Hexagon Maps for .NET 的开源 2D 游戏引擎

    我找不到 2D 游戏引擎来为 net 创建六边形地图 我能找到的最好的是 Xconq http sourceforge net projects xconq http sourceforge net projects xconq 和pyga
  • 特定于文化的日期时间字符串在平台之间不一致

    我有一个测试应用程序 允许用户从组合框中选择区域性 并在多行文本框中显示区域性特定日期 代码如下 public partial class Form1 Form public Form1 InitializeComponent comboB
  • WPF 绑定无法与 int 类型的属性正常工作

    我拥有以下财产int输入我的视图模型 该模型绑定到TextBox 一切正常 TwoWay绑定工作正常 除了一种情况 如果我清除的值TextBox 属性设置器不会被调用 尽管值已被清除TextBox 属性仍保持先前的值 有人遇到过类似的问题吗
  • JIT编译后的代码是如何注入内存并执行的?

    考虑一个典型的 Windows x86 或 AMD64架构 内存为 分为可执行部分 无法写入 和 数据部分 可以写入但不能写入 被处决 想想 DEP JIT 在内存中编译方法 通常 不存储任何东西 磁盘 而是将其移动到哪里 下一条指令指针可
  • 寻找系统、全面、完整的VB.NET和C#语法比较

    我是一名经验丰富的 VB NET 开发人员 想从 C 开始 我正在寻找两种语言语法之间基于网络的比较作为快速参考 我发现自己正在整理 VB NET 语法模板 例如 Public MustInherit Class BaseClass Pub
  • 查询限制与返回类不同的类

    对于我当前的项目 我正在学习 NHibernate 但在翻译以下查询时遇到问题 select person Firstname person Lastname from Person inner join Contract on contr
  • 为什么 BLToolkit 没有更流行? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 您如何使用 ReSharper 5 中的模式匹配功能?

    Resharper 5 的新模式匹配看起来非常强大 尽管需要一些修改才能弄清楚如何使用它 对于那些不熟悉此功能的人 它允许您在代码中搜索特定模式 此类模式的实例可以选择性地替换为替代方案 在 IntelliJ 中 这称为结构搜索和替换 它比
  • 正则表达式替换多个组

    我想使用正则表达式将多个组替换为相应的替换字符串 更换表 gt amp gt hsh 1 gt 5 5 gt 6 例如 对于以下输入字符串 a1asda fj ahdk5adfls 对应的输出字符串是 a5asda ampfj hshahd
  • Web API 请求上的滑动会话

    UPDATE 看起来它正在尝试写入新的 cookie 标头ApplyResponseGrantAsync但不能因为它是抛出标头已发送的异常 UPDATE 更清楚 我如何获得Set Cookie在 Web API 请求期间添加到 XHR 响应
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 防止单个可执行文件的多个进程实例

    我正在使用 NET 和 C 我想阻止同一可执行文件的两个实例同时运行 但我不想阻止从另一个文件夹运行的同一进程 例如 我有一个位于两个不同位置的可执行文件 C MyProject Master Program exe C MyProject
  • 如何从另一个线程阻止 UI 线程或强制表单在 UI 线程内运行

    我的应用程序的一个要求是 如果它失去数据库连接 那么它必须弹出一个大模式 无连接 稍后重试 对话框 阻止所有用户交互 直到重新获得连接为止 我通过在应用程序启动时启动 DeviceMonitor 类的实例来实现此目的 该类创建一个 Syst

随机推荐