.net – SocketAsyncEventArgs.Completed在Windows 8中不会触发
当我在安装了
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连接此服务器,它就像一个魅力.我在开始时这样做,然后神奇地,OnAccepted被调用并写入“已接受”.每个连接上的控制台.我在使用Windows 7和.NET 4的机器上使用相同的代码和相同的程序(Hercules),但它始终有效. >我做错了什么? 编辑:两个操作系统都是64位. 解决方法
原来这是Windows 8的错误.到目前为止,我能找到的最佳解决方法是在不同的线程上启动IOCP操作.
所以我在问题中给出的代码示例中应该做的是改变这一行: Accept(arguments); 在Main方法中的这一行: Task.Run(() => Accept(arguments)).Wait(); 这可以防止Console.ReadLine()调用阻止IOCP操作. 作为旁注:这只是一个操作系统错误的解决方法,它很可能通过更新来修复 – 并且 – 这使得此解决方案变得多余. 最新版本的Windows 8已修复此问题. 编辑:feedback item I have posted in Connect的状态更改为“按设计”.
编辑2:反馈状态再次更改为“活动”,没有详细信息. 编辑3:反馈收到了微软的另一个答案,说明:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |