来自MSDN的异步客户端套接字示例

时间:2012-04-19 14:31:30

标签: c# sockets asynchronous msdn

我对此示例提出了一个问题:Asynchronous Client Socket。 它表示操作是异步的,并且它们 ARE (提供了beginxxx / endxxx),但它们使用ManualResetEvent并且如果我正确理解了示例代码 - 这样的调用:

  Receive(client);
  receiveDone.WaitOne();

将阻止线程,它们被调用。所以,如果我有一个UI应用程序,我从主线程调用异步套接字代码 - 应用程序将冻结......或者我错了?对不起,我希望通过tcp异步发送/接收一些命令而不冻结主线程。我是否必须调用该样本中的所有套接字操作以避免冻结?

2 个答案:

答案 0 :(得分:2)

是的,此代码已设置为可以同步运行。但是,您可以轻松地自己使用Beginxxx和Endxxx调用,而不是将它们包装起来,因为这个(可怜的)异步操作示例已经编写完成。

为了进一步说明,本文确实以异步方式运行每个方法,但是然后使用blocker.WaitOne();进行阻塞更好的方法可能是让你的beginconnect回调触发一个send,这将使其回调触发器成为一个接收等等

您还可以使用TPL并利用其ContinueWith功能来执行此操作。那么你的代码甚至可能看起来更干净:)

答案 1 :(得分:1)

它会阻止UI。 MSDN示例确实展示了异步,但非常糟糕。它也很原始。请看一下我刚刚回答的有关不同异步编程模型的主题。我讨论了很多,并提供了完整示例的所有链接。

链接:Need help to implement multithreading in C#