c# - 在 C# 中等待回调安全吗?

标签 c# multithreading

我有一个 BeginRead,它在完成时调用 ReadCallback 函数。我想在回调中做的是等待缓冲区上的 ManualResetEvent 告诉我缓冲区是否为空,这样我就可以在需要更多数据时发出新的 BeginRead。我已经实现了这个并且它有效。但我的问题是:在回调中等待是否安全? 我是 C# 的新手,如果这些是常规线程我不会有疑问,但我不确定 C# 如何处理回调。

谢谢。

最佳答案

在我能想到的所有情况下,都会在线程池上调用 APM 回调。

这将您的问题简化为“我可以阻止线程池线程吗?”。答案通常是肯定的,但也有缺点。

这样做是“安全的”,直到您耗尽池(然后您会面临死锁和极端吞吐量减少的风险,例如 >1000 倍)。

其他缺点通常是阻塞线程的常见缺点。它们花费大量内存来保存。大量线程会导致大量上下文切换。

你不能只使用 await 吗?我想象你的代码看起来像这样:

while (true) {
 var readResult = await ReadAsync(...);
 await WaitForSomeConditionAsync(); //Instead of ManualResetEvent.
}

没有阻塞。非常简单的代码。无需执行任何特殊操作即可发出下一次读取。它只是作为循环的一部分发生。

My working model is something similar to producer/consumer.

听起来像是 TPL 数据流的一个很好的用途。 Dataflow 自动进行数据转发、等待和节流。它最大限度地支持异步。

关于c# - 在 C# 中等待回调安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776686/

相关文章:

c# - 将 XmlElement 反序列化为自定义对象

java - 如何通过JNI分享进度更新?

c++ - 多线程应用程序概念

c# - 使用 C# 的线程池问题

c# - 有效地将一系列值添加到 ObservableCollection

C#检测所有窗口中的按键事件

c# - 复制流的最后 16 个字节以外的所有字节?流结束的早期检测?

c# - 每秒 SQL 查询

c++ - 是否可以命名 CWinThread 线程?

c - 实现 FCFS 调度程序