嗨,我想进一步了解异步回调与套接字一起工作的方式。
可以说,从我的 UI线程中,我调用 BeginRead 方法,并传入名为的回调,读取。据我了解, BeginRead 产生了一个新线程(线程A),因此UI线程中的代码执行仍可以继续。回调读取是在中执行的。线程A 对吗?它在 EndRead 处阻塞。
然后,线程一旦回调结束,会自动关闭自身吗?
假设线程一旦调用了回调函数,便会自行关闭:::
在线程内调用另一个 BeginRead 意味着安全吗?此 BeginRead 将产生一个线程B 。 线程B 是否执行失败或无法正确放置,是否会由于调用线程A 的线程已结束而在某个时候终止?还是线程根本不依赖于调用者?
最佳答案
您在这里有一些误解。当您调用BeginRead
时,将从您的应用程序的内部线程池中调用您指定的回调。通常没有启动任何新线程,尽管可能只有一个-它由.NET的内部调度程序决定。
如果您在调试器中中断程序并转到“线程” View ,则应该看到一堆名为“ worker 线程”的线程。通常,他们都在 sleep ,等待工作。这比每次您想阅读的BeginRead
旋转一个线程快得多的方法。取而代之的是,它使用准备在后台的这些工作人员。
回调完成后,工作线程将返回池中,以准备进行更多操作。
至于其余的问题:
EndRead
中阻塞。您的应用程序中将没有任何障碍。 IO数据将被缓冲使用,在这种情况下,回调将几乎立即运行。否则数据将在以后提供。在这种情况下,仅在数据出现后才执行回调。这一点很重要,因为这意味着在等待数据时,没有线程在等待任何东西。运行时处理等待的情况,并在出现数据时产生回调。 BeginRead
。没有依赖关系。实际上,这是做IO的好方法。