C# 是否应异步执行对NetworkStream的写入

C# 是否应异步执行对NetworkStream的写入,c#,multithreading,sockets,tcp,client-server,C#,Multithreading,Sockets,Tcp,Client Server,假设NetworkStream.Write()是一个阻塞调用,那么像SendMessage()这样的方法是否应该创建一个新线程来执行写入操作,或者SendMessage()方法是否应该阻塞直到消息被发送或发生异常 我的直觉告诉我,阻止这种方法是合理的,但我发现他们正在创建一个新线程。我看到的创建另一个线程的主要问题是错误处理 PS:我知道写、读等的异步版本,但发现IAsyncResult相当混乱,目前正在推迟使用这些选项。我强烈建议您查看 您可以从当前.net中的任何异步模式创建任务 任务将在线

假设
NetworkStream.Write()
是一个阻塞调用,那么像
SendMessage()
这样的方法是否应该创建一个新线程来执行写入操作,或者
SendMessage()
方法是否应该阻塞直到消息被发送或发生异常

我的直觉告诉我,阻止这种方法是合理的,但我发现他们正在创建一个新线程。我看到的创建另一个线程的主要问题是错误处理


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

我强烈建议您查看

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


任务将在线程池中执行,异常将从其他线程中进行封送处理。

我强烈建议您查看

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


任务将在线程池上执行,异常将从其他线程进行封送处理。

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

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

为每个客户机创建一个新线程有一个缺点:大量线程将消耗大量资源,并且这些线程大部分时间都处于空闲状态,而它们可以同时为其他客户机提供服务。如果您希望创建一个高性能的服务器应用程序,您应该学习异步编程

退房。它可以让您编写类似于同步代码的异步代码,而不会出现混乱的回调

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

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

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

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

为每个客户机创建一个新线程有一个缺点:大量线程将消耗大量资源,并且这些线程大部分时间都处于空闲状态,而它们可以同时为其他客户机提供服务。如果您希望创建一个高性能的服务器应用程序,您应该学习异步编程

退房。它可以让您编写类似于同步代码的异步代码,而不会出现混乱的回调

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

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

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