3

我有一个关于这个例子的问题:异步客户端套接字。它说这些操作是异步的并且它们(出现了beginxxx/endxxx),但它们使用ManualResetEvent并且如果我正确理解示例代码 - 这样的调用:

  Receive(client);
  receiveDone.WaitOne();

会阻塞线程,它们是从中调用的。因此,如果我有一个带有 UI 的应用程序并且我从主线程调用该异步套接字代码 - 应用程序将冻结......或者我错了吗?抱歉,我希望在不冻结主线程的情况下通过 tcp 异步发送/接收一些命令。我是否必须调用该示例中的所有套接字操作以避免冻结?

4

2 回答 2

2

是的,此代码已设置为同步运行。但是,您可以轻松地自己使用 Beginxxx 和 Endxxx 调用,而不是像编写这个(糟糕的)异步操作示例一样包装它们。

为了进一步澄清,本文确实异步运行每个方法,但随后使用阻止blocker.WaitOne();类似这样的更好方法可能是让您的 beginconnect 回调触发发送,这将使其回调触发接收等

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

于 2012-04-19T14:37:46.247 回答
1

它会阻止用户界面。MSDN 示例确实演示了异步,但效果很差。它也很原始。请查看这个主题,我也刚刚回答了有关不同异步编程模型的问题。我讨论了很多,并为所有这些提供了链接和完整的例子。

链接:在 C# 中实现多线程需要帮助

于 2012-04-19T14:36:55.837 回答