private void openServer_Click(object sender, EventArgs e) { //首先,第一点,不能在主线程上while waitone,这种sb行为都干得出。 //总之,能不在主线程上做的事就不要在主线程上做。 Task.Run(() => { isRunning = true; listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipEndPoint = new IPEndPoint(serviceIP, servicePort); listenSocket.Bind(ipEndPoint); listenSocket.Listen(100); while (isRunning) { //这套东西在主线程上执行时,发生卡死的情况是因为主线程waitone了,异步操作里想要通过主线程执行方法,当然也会卡死。 manual.Reset(); var acceptArgs = argsPool.PopSocketAsyncEventArgs(); if (acceptArgs != null) { listenSocket.AcceptAsync(acceptArgs); } manual.WaitOne(); } }); }