C# MSDN中的异步客户端套接字示例
我有一个关于这个例子的问题:。 它表示操作是异步的,它们是(提供了beginxxx/endxxx),但它们使用C# MSDN中的异步客户端套接字示例,c#,sockets,asynchronous,msdn,C#,Sockets,Asynchronous,Msdn,我有一个关于这个例子的问题:。 它表示操作是异步的,它们是(提供了beginxxx/endxxx),但它们使用ManualResetEvent,如果我正确理解示例代码,则此类调用: Receive(client); receiveDone.WaitOne(); 将阻止线程,它们是从中调用的。所以,若我有一个带有UI的应用程序,并且我从主线程调用那个异步套接字代码,那个么应用程序将冻结……或者我错了?抱歉,我希望在不冻结主线程的情况下通过tcp异步发送/接收一些命令。我是否需要调用该样本
ManualResetEvent
,如果我正确理解示例代码,则此类调用:
Receive(client);
receiveDone.WaitOne();
将阻止线程,它们是从中调用的。所以,若我有一个带有UI的应用程序,并且我从主线程调用那个异步套接字代码,那个么应用程序将冻结……或者我错了?抱歉,我希望在不冻结主线程的情况下通过tcp异步发送/接收一些命令。我是否需要调用该样本中的所有套接字操作以避免冻结 它会阻塞用户界面。MSDN示例确实演示了异步,但非常糟糕。它也很原始。请看我刚才回答的关于不同异步编程模型的主题。我讨论了很多问题,并提供了所有这些问题的完整示例链接
链接:是的,此代码设置为同步运行。但是,您可以自己轻松地使用Beginxxx和Endxxx调用,而不是在编写异步操作的这个(糟糕的)示例时包装它们 为了进一步澄清,本文确实异步运行了每个方法,但随后使用
blocker.WaitOne()阻塞代码>更好的方法可能是让您的beginconnect回调触发发送,而它的回调触发接收,等等
您还可以使用并利用其功能来执行此操作。然后,您的代码可能看起来更干净:)谢谢大家的回答。我担心我问了一些愚蠢的问题,结果证明我理解正确@大卫·安德森,谢谢你的例子@0x49D1这通常是正确的,但就像生活中的每件事一样,你永远不应该仅仅因为某件事来自某个特定的地方就同意它(而你没有,这很好:)。此外,MSDN文章通常是由外部人员编写的(我在这里看不到),因此它并不总是直接来自Redmond。该示例适用于控制台应用程序。我认为这在GUI应用程序中更有意义,因为您可以让Receive回调绘制视图更新,而Send函数只在单击按钮(或其他事件)时调用。本例中阻塞的唯一原因是确保连接、发送、接收、关闭的线性事件,并防止程序在回调完成之前退出。