我对此示例提出了一个问题:Asynchronous Client Socket。
它表示操作是异步的,并且它们 ARE (提供了beginxxx / endxxx),但它们使用ManualResetEvent
并且如果我正确理解了示例代码 - 这样的调用:
Receive(client);
receiveDone.WaitOne();
将阻止线程,它们被调用。所以,如果我有一个UI应用程序,我从主线程调用异步套接字代码 - 应用程序将冻结......或者我错了?对不起,我希望通过tcp异步发送/接收一些命令而不冻结主线程。我是否必须调用该样本中的所有套接字操作以避免冻结?
答案 0 :(得分:2)
是的,此代码已设置为可以同步运行。但是,您可以轻松地自己使用Beginxxx和Endxxx调用,而不是将它们包装起来,因为这个(可怜的)异步操作示例已经编写完成。
为了进一步说明,本文确实以异步方式运行每个方法,但是然后使用blocker.WaitOne();
进行阻塞更好的方法可能是让你的beginconnect回调触发一个send,这将使其回调触发器成为一个接收等等
您还可以使用TPL并利用其ContinueWith功能来执行此操作。那么你的代码甚至可能看起来更干净:)
答案 1 :(得分:1)
它会阻止UI。 MSDN示例确实展示了异步,但非常糟糕。它也很原始。请看一下我刚刚回答的有关不同异步编程模型的主题。我讨论了很多,并提供了完整示例的所有链接。