我有一个简单的客户端应用程序,通过网络以低吞吐量接收字节缓冲区。下面是代码:
private static readonly HashSet<int> _capturedThreadIds = new HashSet<int>();
private static void RunClient(Socket socket)
{
var e = new SocketAsyncEventArgs();
e.SetBuffer(new byte[10000], 0, 10000);
e.Completed += SocketAsyncEventsArgsCompleted;
Receive(socket, e);
}
private static void Receive(Socket socket, SocketAsyncEventArgs e)
{
var isAsynchronous = socket.ReceiveAsync(e);
if (!isAsynchronous)
SocketAsyncEventsArgsCompleted(socket, e);
}
private static void SocketAsyncEventsArgsCompleted(object sender, SocketAsyncEventArgs e)
{
if (e.LastOperation != SocketAsyncOperation.Receive || e.SocketError != SocketError.Success || e.BytesTransferred <= 0)
{
Console.WriteLine("Operation: {0}, Error: {1}, BytesTransferred: {2}", e.LastOperation, e.SocketError, e.BytesTransferred);
return;
}
var thread = Thread.CurrentThread;
if (_capturedThreadIds.Add(thread.ManagedThreadId))
Console.WriteLine("New thread, ManagedId: " + thread.ManagedThreadId + ", NativeId: " + GetCurrentThreadId());
//Console.WriteLine(e.BytesTransferred);
Receive((Socket)sender, e);
}
应用程序的线程行为非常奇特:
SocketAsyncEventsArgsCompleted
方法经常在新线程中运行。我本来以为经过一段时间后不会再创建新的线程,因为有线程池(或IOCP线程池),而且吞吐量非常稳定,所以我本来以为线程将被重用。- 线程数量保持较低水平,但我可以在进程资源管理器中看到线程频繁地被创建和销毁。同样地,我不认为线程应该被创建或销毁。
你能解释一下应用程序的行为吗?
编辑:低吞吐量为每秒20个消息(大约200 KB/s)。如果我将吞吐量增加到每秒1000条以上(50 MB/s),应用程序的行为不会改变。
RunClient
的主函数。线程的创建和销毁只能与SocketAsyncEventArgs
相关联。 - cao