当我在安装了 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(使用前将#替换为@)