【问题标题】:Should writes to NetworkStream be performed asynchronously是否应该异步执行对 NetworkStream 的写入
【发布时间】:2011-08-14 10:47:48
【问题描述】:

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

我的直觉告诉我阻止此方法是合理的,但查看really nice example of sockets in C# 我发现他们正在创建一个新线程。我看到创建另一个线程的主要问题是错误处理。

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

【问题讨论】:

  • 我真的会学习使用该方法的异步版本。如果您以后需要进行异步 Web 请求,它也会对您有所帮助,因为模型是相同的。此外,如果您想转向 Silverlight 开发,它们只为某些功能提供异步方法。

标签: c# multithreading sockets tcp client-server


【解决方案1】:

我强烈建议你看看Task Parallel Library

您可以从当前 .net 中的任何异步模式创建任务。

任务将在线程池上执行,异常会从其他线程中友好地编组。

【讨论】:

    【解决方案2】:

    如果您在 UI 线程上调用 SendMessage(),那么它将阻塞它并且您的应用程序将“冻结”。不要在每次要发送数据时创建一个新线程,而是在 .NET 4.0 中使用 Task Parallel Library 中的 ThreadPool.QueueUserItem(o => SendMessage())Task.Factory.StartNew(() => SendMessage())

    如果您的应用程序正在为客户端提供服务,并且您为每个客户端创建了一个新线程,那么如果您在向客户端发送数据时不想做其他工作,SendMessage() 可以阻止。

    为每个客户端创建一个新线程有一个缺点:大量线程会消耗大量资源,并且大多数时候这些线程会处于空闲状态,而与此同时它们可能正在为其他客户端提供服务。如果您希望创建高性能的服务器应用程序,您应该了解异步编程。

    查看Async CTP。它可以让你编写看起来像同步代码的异步代码,没有混乱的回调

    public async void SendMessage()
    {
        try {
            await socket.WriteAsync(buffer, 0, buffer.Length);
        } catch (...) {
            // handle it
       }
    }
    

    现在 SendMessage() 不会阻塞,因为它会异步执行,而且看起来一点也不可怕!

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多