正在 C# 中的回调保险箱内等待

本文关键字:保险箱 等待 回调 正在 | 更新日期: 2023-09-27 18:36:17

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

谢谢。

正在 C# 中的回调保险箱内等待

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

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

耗尽池之前这样做是"安全的"(然后您可能会面临死锁和极端吞吐量降低的风险,例如>1000x)。

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

你不能用等待吗?我想你的代码看起来像这样:

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

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

我的工作模式类似于生产者/消费者。

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