gpt4 book ai didi

c# - 异步回调和套接字

转载 作者:行者123 更新时间:2023-11-30 12:32:04 25 4
gpt4 key购买 nike

您好,我想了解更多有关Async Callbacks 如何与Sockets 一起工作的信息。

假设我从我的UI Thread 调用BeginRead 方法并传入一个名为Read 的回调。据我了解,BeginRead 生成了一个新线程(Thread A),因此 UI 线程中的代码执行仍然可以继续。回调 Read 是在 Thread A 中执行的吧?它在 EndRead 处阻塞。

那么线程A是否会在回调结束后自动关闭?

假设 线程 A 在回调被调用后自行关闭:::

这是否意味着在 Thread A 结束之前调用另一个 BeginRead 是安全的?此 BeginRead 将生成一个 Thread BThread B 是否会无法执行或无法正确放置它,它是否会在某个时刻终止,因为调用线程 Thread A 已经结束?还是线程根本不依赖于调用者?

最佳答案

你在这里有一些误解。当您调用 BeginRead 时,您指定的回调将从应用程序的内部线程池中调用。通常不会启动新线程,尽管可能有一个 - 它取决于 .NET 的内部调度程序。

如果您在调试器中中断程序并转到“线程” View ,您应该会看到一堆名为“工作线程”的线程。通常他们都在 sleep 并等待工作。这比 BeginRead 每次您想阅读时都启动一个线程要快得多。取而代之的是,它使用这些在后台准备就绪的工作人员。

当回调完成时,工作线程返回池中,准备执行更多操作。

至于你剩下的问题:

  • 回调不应在 EndRead 中阻塞。您的应用程序中不会有任何阻塞。 IO 数据将可用或者缓冲,在这种情况下,回调将几乎立即运行。或者数据将在很久以后才可用。在这种情况下,只有在数据出现后才会执行回调。这一点很重要,因为这意味着当您等待数据时,没有 线程在等待任何事情。运行时处理等待情况并在数据出现时产生回调。
  • 是的,从回调中调用另一个 BeginRead 是安全的。没有依赖关系。事实上,这样做是一种很好的 IO 方式。
  • 线程从不依赖于调用者。它们是完全独立的,只有在自然终止或进程本身终止时才会终止。

关于c# - 异步回调和套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com