鉴于 NetworkStream.Write()
是一个阻塞调用,像 SendMessage()
这样的方法应该创建一个新线程来执行写操作,或者 SendMessage()
方法阻塞,直到消息发送或发生异常?
我的直觉告诉我阻止此方法是合理的,但查看 really nice example of sockets in C#我发现他们正在创建一个新线程。我在创建另一个线程时看到的主要问题是错误处理。
PS:我知道写入、读取等的异步版本,但发现 IAsyncResult 相当困惑,目前正在推迟使用这些选项。
最佳答案
如果您在 UI 线程上调用 SendMessage()
,那么它将阻止它并且您的应用程序将“卡住”。不是每次要发送数据时都创建一个新线程,而是使用 ThreadPool.QueueUserItem(o => SendMessage())
或 Task.Factory.StartNew(() => SendMessage() )
来自 Task Parallel Library在 .NET 4.0 中
如果您的应用程序正在为客户端提供服务,并且您为每个客户端创建了一个新线程,那么如果您不想在向客户端发送数据时执行其他工作,则 SendMessage()
可以阻塞。
为每个客户端创建一个新线程有一个缺点:大量线程会消耗大量资源,而且大多数时候这些线程将处于空闲状态,同时它们可以为其他客户端提供服务。如果您希望创建高性能服务器应用程序,您应该了解异步编程。
查看 Async CTP .它会让你写出看起来像同步代码的异步代码,没有乱七八糟的回调
public async void SendMessage()
{
try {
await socket.WriteAsync(buffer, 0, buffer.Length);
} catch (...) {
// handle it
}
}
现在 SendMessage() 不会阻塞,因为它是异步执行的,看起来一点也不可怕!
关于c# - 应该异步执行对 NetworkStream 的写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814600/