c# - 应该异步执行对 NetworkStream 的写入

标签 c# multithreading sockets tcp client-server

鉴于 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/

相关文章:

c# - 在 TCP 连接中使用安全性

c# - 使用 ASP.NET Webforms 的 Ajax 发布

c++ - 如何维护对另一个类中元素的线程安全引用

java - Java实际上是否并行运行线程

macos - 异常 : connect: does not exist (Connection refused) when trying to connect to TCP socket in Haskell

c# - Dapper DynamicParameters 对象是否可以像参数字典一样被枚举?

c# - 将消息从网站发布到 Facebook 墙

python - 杀死在不同端口上运行的多个httpserver

c++ - 套接字内存泄漏

c# - 如何获取套接字数据包中数据的实际大小c#