【问题标题】:Asynchronous Client Socket Example from MSDNMSDN 中的异步客户端套接字示例
【发布时间】:2012-04-19 14:31:30
【问题描述】:

我对这个例子有疑问:Asynchronous Client Socket。 它说这些操作是异步的,它们 ARE (出现了beginxxx/endxxx),但它们使用ManualResetEvent,如果我正确理解示例代码 - 这样的调用:

  Receive(client);
  receiveDone.WaitOne();

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

【问题讨论】:

  • 该示例适用于控制台应用程序。我认为这在 GUI 应用程序中更有意义,因为您可以让 Receive 回调绘制更新到视图,并且仅在单击按钮(或其他一些事件)时调用 Send 函数。在这个例子中阻塞的唯一原因是确保连接、发送、接收、关闭的线性事件,并防止程序在回调完成之前退出。

标签: c# sockets asynchronous msdn


【解决方案1】:

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

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

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

【讨论】:

  • @0x49D1 这通常是正确的,但就像生活中的一切一样,你永远不应该仅仅因为它来自特定的地方而同意某件事(而你没有,这很好:))。此外,MSDN 文章通常是由外人撰写的(我在这里没有看到),因此并不总是直接来自 Redmond
【解决方案2】:

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

链接:Need help to implement multithreading in C#

【讨论】:

  • 谢谢你们的答案。我担心我问了一些愚蠢的事情,结果我理解正确。 @大卫安德森,谢谢你的例子!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多