C#:崩溃ManualResetEvent
-
03-07-2019 - |
题
我写了我的码的使用 这篇文章在msdn 作为一个主要帮手
我的代码:
private ManualResetEvent _AllDone = new ManualResetEvent(false);
internal void Initialize(int port,string IP)
{
IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_Accpt.Bind(_Point);
_Accpt.Listen(2);
while (true)
{
_AllDone.Reset();
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
_AllDone.WaitOne(); <<crash here
}
}
这是会发生什么,我设置一个断点在BeginAccept(我以为那里的问题),但它步骤,它通常。然而,当我试图步骤"_AllDone.使用此()"-服务器崩溃。
如果_allDone不能用于win32形式的应用-我怎么做我的项目?
编辑
我忘了说我写了_AllDone.Reset()在接受(),但它不去那里,我设置一个断点的存在,但它不会去。
private void Accept(IAsyncResult async)
{
_AllDone.Set();
Socket _Accpt = (Socket)async.AsyncState;
Socket _Handler = _Accpt.EndAccept(async);
StateObject _State = new StateObject();
_State.workSocket = _Handler;
_Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}
解决方案
所以,如果我做对了,你想在收到套接字连接后立即重新启动 Accept
,而不是等到 Accept
完成,那就是为什么不使用 Accept
的同步版本。
所以你说当你将套接字连接到指定的地址和端口时,它不会激活你的Accept方法?因为这就是Accept所做的:它接受一个新的传入连接,等待客户端连接。这可能就是为什么你认为它“崩溃”的原因。以及为什么它永远不会在您的Accept方法中达到您的代码。
提示:也许还可以查看 <代码> Socket.AcceptAsync 代码>
编辑:要设置侦听传入连接的异步服务器,您不需要任何ManualWaitEvent:
internal void Initialize(int port,string IP) {
IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_Accpt.Bind(_Point);
_Accpt.Listen(2);
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}
private void Accept(IAsyncResult async) {
Socket _Accpt = (Socket)async.AsyncState;
Socket _Handler;
try {
_Handler = _Accpt.EndAccept(async);
} finally {
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}
StateObject _State = new StateObject();
_State.workSocket = _Handler;
_Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}
注意:您还需要退出条件,以便不调用BeginAccept(例如,当您要关闭服务器时)。
其他提示
我认为,Lucero是想说,该应用程序的工作通常情况下,你可能会问,如何来。
好吧当你正在使用的一个服务器的侧座应用程序,什么基本上你做的就是来要求服务器liseten的一个端口和等待一个连接到达。当连接达然后你做剩下的代码。
什么Lucero说的是,虽然没有消息是达到服务器服务器保存lisetning和等待,这可能会找你如果它冻结。
是它的情况下,在你的代码吗?
不隶属于 StackOverflow