应该异步执行对NetworkStream的写操作
本文关键字:操作 NetworkStream 异步 执行 | 更新日期: 2023-09-27 17:53:18
给定NetworkStream.Write()
是阻塞调用,应该像SendMessage()
这样的方法创建一个新线程来执行写操作,还是应该SendMessage()
方法阻塞直到消息发送或发生异常?
我的直觉告诉我,阻止这种方法是合理的,但是在c#中查看一个非常好的套接字示例,我发现它们正在创建一个新线程。我看到创建另一个线程的主要问题是错误处理。
PS:我知道异步版本的写,读等等,但发现IAsyncResult相当混乱,我目前推迟使用这些选项。
如果你在一个UI线程上调用SendMessage()
,那么它将阻止它,你的应用程序将"冻结"。不要每次发送数据时都创建一个新线程,可以使用。net 4.0任务并行库中的ThreadPool.QueueUserItem(o => SendMessage())
或Task.Factory.StartNew(() => SendMessage())
。
如果你的应用程序正在为客户端服务,并且你为每个客户端创建了一个新线程,那么如果你不想在向客户端发送数据时做其他工作,那么SendMessage()
可以阻塞。
为每个客户端创建一个新线程有一个缺点:大量线程将消耗大量资源,并且大多数时候这些线程将空闲,而它们可以同时为其他客户端服务。如果你想创建一个高性能的服务器应用程序,你应该学习异步编程。
查看异步CTP。它将允许您编写看起来像同步代码的异步代码,而没有混乱的回调
public async void SendMessage()
{
try {
await socket.WriteAsync(buffer, 0, buffer.Length);
} catch (...) {
// handle it
}
}
现在SendMessage()将不会阻塞,因为它将异步执行,它看起来一点也不可怕!
我强烈建议你看一下任务并行库。
你可以从当前。net中的任何异步模式创建Task。
任务将在线程池中执行,异常将被其他线程友好地封送。