何时在处理TcpClients时使用异步?

时间:2011-09-18 00:10:59

标签: c# asynchronous tcpclient

  

可能重复:
  Difference between NetworkStream.Read() and NetworkStream.BeginRead()?

稍微弄乱TcpClient类,我注意到TcpClient.GetStream()类同时具有Read()BeginRead() and EndRead()函数。

我应该使用以下哪些?我意识到Begin和End函数是异步函数但我应该使用它们吗?在什么情况下我会使用Read与其异步对应?怎么样写?

目前我正在做这样的事情:

byte[] message = new byte[4096];
int bytesRead = clientStream.Read(message, 0, 4096);

我应该使用BeginRead和EndRead吗?

1 个答案:

答案 0 :(得分:3)

同步和异步方法之间的选择本质上是应用程序的线程模型的选择。因为对于大多数应用程序而言,当用户执行其他任务(例如访问网络,如同所讨论的情况)时对用户没有响应是不可接受的,您需要提供一种在工作完成时响应用户输入的方法

两种最常见的选择是

  1. 使您的应用程序成为多线程,有效地允许它同时执行多项操作
  2. 使用异步回调和处理小块的工作,同时在处理这些块之间响应用户
  3. 选择例如ReadBeginRead对应于上面选项1和2之间的选择(我假设如果使用阻塞方法,例如Read,则需要在不同于您的线程的线程上执行此操作UI运行,因此从技术上讲,没有必要,在实践中使用阻塞调用的应用程序将是多线程的。

    如果您不完全理解我所说的内容,请使用同步调用,因为它会更容易。如果您的申请开始无响应,您将有机会在以后重新考虑您的方法。