我正在开发一个通过套接字接收 tcp 数据的低延迟金融应用程序。
这就是我建立套接字连接和接收字节的方式:
public class IncomingData
{
Socket _Socket;
byte[] buffer = new byte[4096];
public static void Connect(IPEndPoint endPoint)
{
_Socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_Socket.Connect(endPoint);
}
public static void ReadSocket(int ReadQty)
{
_Socket.Receive(buffer, 0, ReadQty, SocketFlags.None);
}
}
我听说当您在 Stream 套接字上调用 Receive()
时,调用线程会进入休眠状态,并在接收到数据时被唤醒。我希望线程全速运行(使用 CPU 容量)。
有没有一种方法可以使用 Stream 套接字来做到这一点?如果唯一的方法是使用原始套接字,您能否提供一个示例?
最佳答案
如果我没理解错的话,你希望 Receive 不阻塞?
看看套接字类的 BeginX
/EndX
方法。这些方法异步执行(不阻塞当前线程)。它们接受一个回调方法作为它们的参数之一,该方法将在操作完成时被调用(在这种情况下,将接收到数据)。它本质上与事件相同。
public class IncomingData
{
Socket _Socket;
byte[] buffer = new byte[4096];
public static void Connect(IPEndPoint endPoint)
{
_Socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_Socket.Connect(endPoint);
}
public static void ReadSocket(int ReadQty)
{
// Wait for some data to be received. When data is received,
// ReceiveCallback will be called.
_Socket.BeginReceive(buffer, 0, ReadQty, SocketFlags.None, ReceiveCallback, null);
}
private static void ReceiveCallback(IAsyncResult asyncResult)
{
int bytesTransferred = _Socket.EndReceive(asyncResult);
// ...
// process the data
// ...
}
}
关于c# - 调用 Socket.Receive 时防止线程休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872771/