当我在安装了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并将"Accepted."写入控制台。我在拥有Windows 7和.NET 4的机器上使用相同的代码和相同的程序(Hercules),但它总是起作用。
- 我做错了什么吗?
- 如果不是,那么这是我操作系统或.NET Framework版本4.5的已知bug吗?
- 有人能复现这个问题吗?
编辑:两个操作系统均为64位。
编辑2:我在Microsoft Connect上报告了这个错误,在这里。
编辑3:找到了一个解决方法,并将其发布到Connect(通过创建虚假的第一个连接)。
编辑4:如果有人能够复现此问题,请在Connect中加入该问题。
编辑5:我看到了Thomas提到的问题,并测试了Console.ReadLine
是否会导致这种情况。结果证明是这样的。如果在我的Console.ReadLine
调用之前添加Thread.Sleep(3000)
,并在运行程序3秒钟后进行连接尝试,则它的效果非常好。同样,奇怪的是,在调用Console.ReadLine
之前只需要执行一次此操作。如果我在调用Console.ReadLine
之前进行一次连接,那么每个连续的连接都有效,即使在调用Console.ReadLine
之后也是如此。我将在Conect页面中提到这一点。
编辑6:我将链接添加到Connect页面中,并添加了另一个解决方法,其中包括在调用Console.ReadLine
之前调用Thread.Sleep
,就像我在上面的编辑中提到的那样。