嗨,我想了解更多有关Async Callbacks如何与套接字一起使用的信息.
让我们从我的UI线程说我调用BeginRead方法并传入一个名为Read的回调.根据我的理解,BeginRead会生成一个新线程(线程A),因此UI线程中的代码执行仍然可以继续.回调Read是在线程A中执行的吗?它在EndRead处阻塞.
那么一旦回调结束,线程A会自动关闭吗?
假设一旦调用回调,线程A就会自行关闭:::
这是否意味着在它结束之前调用Thread A中的另一个BeginRead是安全的?这个BeginRead会产生一个线程B.线程B是无法执行还是正确放置它,它会在某个时候终止,因为线程A的调用线程已经结束了吗?或者线程完全不依赖于调用者?
最佳答案 你在这里有一些误解.当您调用BeginRead时,将从应用程序的内部线程池中调用您指定的回调.通常没有新线程启动,但可能有一个 – 它是.NET的内部调度程序.
如果你在调试器中破坏你的程序并转到Threads视图,你会看到一堆名为Worker threads的线程.通常所有人都在睡觉,等待工作.这比每次想要读取时BeginRead都会启动一个线程要快得多.相反,它使用位于后台的这些工作人员,准备好了.
当回调完成后,工作线程返回池中,准备好进行更多操作.
至于你的其他问题:
>回调不应该在EndRead中阻止.您的申请中不会有任何阻止. IO数据可以缓冲,在这种情况下,回调几乎可以立即运行.或者数据将在稍后提供.在这种情况下,只有在数据出现后才会执行回调.这是一个重要的观点,因为它意味着在您等待数据时,没有线程可以等待任何事情.运行时接受等待的情况,并在数据出现时产生回调.
>是的,可以安全地从你的回调中调用另一个BeginRead.没有依赖关系.实际上,这是以这种方式执行IO的好方法.
>线程永远不会依赖于调用者.它们是完全独立的,只有在自然终止或过程本身死亡时才会死亡.