所以我开始用套接字和异步读取它们。异步套接字读取
第一个问题是什么这之间的区别:
socket.BeginReceive(readResult.Buffer, 0, SocketReadResult.BufferSize, 0, new AsyncCallback(ReadCallback), readResult);
和
socket.BeginReceive(readResult.Buffer, 0, SocketReadResult.BufferSize, 0, ReadCallback, readResult);
此外,由于这是我的回调函数,为什么例子,我读有一个尝试/抓住整个事情,当然你只需要围绕socket.EndReceive()
呼叫尝试/抓住?
public void ReadCallback(IAsyncResult ar)
{
try
{
var readResult = (SocketReadResult)ar.AsyncState;
var socket = readResult.Socket;
int bytesRead = socket.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
readResult.Text.Append(Encoding.ASCII.GetString(readResult.Buffer, 0, bytesRead));
// Get the rest of the data.
socket.BeginReceive(readResult.Buffer, 0, SocketReadResult.BufferSize, 0, new AsyncCallback(ReadCallback), readResult);
}
else
{
var newRead = new SocketReadResult(socket);
socket.BeginReceive(readResult.Buffer, 0, SocketReadResult.BufferSize, 0, new AsyncCallback(ReadCallback), newRead);
// All the data has arrived; put it in response.
if (readResult.Text.Length > 1) ((IMessageSender)this).RouteMessage(this, new MessageString(readResult.Text.ToString()));
}
}
catch (Exception e)
{
// TODO: manage this exception.
}
}
public struct SocketReadResult
{
StringBuilder Text;
Socket Socket;
byte[] Buffer;
public const int BufferSize = 1024;
public SocketReadResult(Socket s)
{
Socket = s;
Buffer = new byte[BufferSize];
Text = new StringBuilder();
}
}
最后所有的,你应该要正常关闭你叫socket.BeginReceive()
后的监听器,你叫什么功能,以及它是如何管理的?
至于为什么的try/catch是围绕整个方法,ReadCallBack将异步可能在另一个线程或线程池进行。如果抛出一个异常,它将不会像您期望的那样传播回主线程,并且会最终导致进程崩溃。出于这个原因,你总是需要拥有任何可以在try/catch中完全包装的独立线程上运行的任何东西,因为这是你最后一次正确处理错误的机会。 – Despertar
不同的签名和异常处理实际上是两个单独的问题。你不应该在同一个问题中提问。选择一个或另一个,然后编辑另一个(如果需要,将其作为新问题发布)。 – Servy
我没有明白为什么你要读取甚至当bytesRead == 0在其他部分? –