应该异步执行对NetworkStream的写操作

本文关键字:操作 NetworkStream 异步 执行 | 更新日期: 2023-09-27 17:53:18

给定NetworkStream.Write()是阻塞调用,应该像SendMessage()这样的方法创建一个新线程来执行写操作,还是应该SendMessage()方法阻塞直到消息发送或发生异常?

我的直觉告诉我,阻止这种方法是合理的,但是在c#中查看一个非常好的套接字示例,我发现它们正在创建一个新线程。我看到创建另一个线程的主要问题是错误处理。

PS:我知道异步版本的写,读等等,但发现IAsyncResult相当混乱,我目前推迟使用这些选项。

应该异步执行对NetworkStream的写操作

如果你在一个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。

任务将在线程池中执行,异常将被其他线程友好地封送。