在下面的代码中,我拨打了从Main()
到Receive()
的来电,然后调用Async BeginReceive()
,并完成在后台线程中接收数据。
问题:对于第一次读取,BeginReceive成功并附加StringBuilder。但是,再次调用时,永远不会达到if(bytesread>0)
条件,因此我从不对收到的数据采取行动。
我希望BeginReceive处理多个读取,并且(我认为这与线程有关)我希望Main()
函数始终从客户端侦听新的COMMANDS(不是新的连接,我' d喜欢保持相同的Socket)。这甚至可能吗?
Attempts At Solution:我添加了ManualResetEvent,试图阻止Main()
函数在另一个线程中进行异步读取之前退出。
Main()中的相关代码:
Receive(server); //await instructions from the client
done.WaitOne(); //This is a ManualResetEvent.
Console.ReadLine();
方法定义:
public static void Receive(Socket server)
{
try
{
SocketArgs sockargs = new SocketArgs();
sockargs.handler = server;
server.BeginReceive(sockargs.buffer, 0, sockargs.buffersize, 0, new AsyncCallback(ReceiveCallBack), sockargs);
}
catch
{
}
}
public static void ReceiveCallBack(IAsyncResult ia)
{
try
{
SocketArgs sockargs = (SocketArgs)ia.AsyncState;
Socket server = sockargs.handler;
int BytesRead = server.EndReceive(ia);
if (BytesRead > 0)
{
//Continue reading data.
sockargs.sb.Append(Encoding.ASCII.GetString(sockargs.buffer, 0, BytesRead));
MessageBox.Show(sockargs.sb.ToString());
server.BeginReceive(sockargs.buffer, 0, sockargs.buffersize, 0, new AsyncCallback(ReceiveCallBack), sockargs);
}
else
{ //Do stuff with sb.ToString()
done.Set();
}
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
}
答案 0 :(得分:0)
当套接字断开连接时,BytesRead仅返回零。因此,我的问题的解决方案是简单地处理else {}部分中的断开连接。
可以在这个非常有用的article中绑定更多信息。
编辑:为了澄清,我在if()结构的末尾留下了BeginReceive()调用,因此“始终”发生了BeginReceive()操作。
答案 1 :(得分:0)
重置事件,以便WaitOne
再次阻止。根据评论,事件被错误地置于设置状态,导致Main退出。