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

Is waiting inside a callback safe in C#?

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

谢谢。

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

这将您的问题减少为 "Can I block thread-pool threads?"。答案通常是肯定的,但也有缺点。

这样做是 "safe",直到您耗尽池(然后您冒着死锁和极端吞吐量减少的风险,例如 >1000 倍)。

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

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

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

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

My working model is something similar to producer/consumer.

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