- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我想了解更多有关Async Callbacks 如何与Sockets 一起工作的信息。
假设我从我的UI Thread 调用BeginRead 方法并传入一个名为Read 的回调。据我了解,BeginRead 生成了一个新线程(Thread A),因此 UI 线程中的代码执行仍然可以继续。回调 Read 是在 Thread A 中执行的吧?它在 EndRead 处阻塞。
那么线程A是否会在回调结束后自动关闭?
假设 线程 A 在回调被调用后自行关闭:::
这是否意味着在 Thread A 结束之前调用另一个 BeginRead 是安全的?此 BeginRead 将生成一个 Thread B。 Thread B 是否会无法执行或无法正确放置它,它是否会在某个时刻终止,因为调用线程 Thread A 已经结束?还是线程根本不依赖于调用者?
最佳答案
你在这里有一些误解。当您调用 BeginRead
时,您指定的回调将从应用程序的内部线程池中调用。通常不会启动新线程,尽管可能有一个 - 它取决于 .NET 的内部调度程序。
如果您在调试器中中断程序并转到“线程” View ,您应该会看到一堆名为“工作线程”的线程。通常他们都在 sleep 并等待工作。这比 BeginRead
每次您想阅读时都启动一个线程要快得多。取而代之的是,它使用这些在后台准备就绪的工作人员。
当回调完成时,工作线程返回池中,准备执行更多操作。
至于你剩下的问题:
EndRead
中阻塞。您的应用程序中不会有任何阻塞。 IO 数据将可用或者缓冲,在这种情况下,回调将几乎立即运行。或者数据将在很久以后才可用。在这种情况下,只有在数据出现后才会执行回调。这一点很重要,因为这意味着当您等待数据时,没有 线程在等待任何事情。运行时处理等待情况并在数据出现时产生回调。BeginRead
是安全的。没有依赖关系。事实上,这样做是一种很好的 IO 方式。关于c# - 异步回调和套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119664/
我参加了一些类(class)并阅读了 YAGNI 的用途。但是,作为一个整体,这个原则从来没有让我满意。它引入了一个逻辑悖论。 作为一个假设,您正在设计一个打算向前扩展的框架。 YAGNI(可能还有
我是一名优秀的程序员,十分优秀!