c# - 线程安全的异步字节队列

标签 c# multithreading .net-3.5 queue producer-consumer

我有一个回调方法,每当有新数据可用时就会调用该方法:

public delegate void DataCallback(
    byte[] buffer,
    int offset,
    int count);

我想将它包装在一个类中,该类实现了与此类似的接口(interface):

public interface IDataSource
{
    IAsyncResult BeginRead(
        byte[] buffer,
        int offset,
        int size,
        TimeSpan timeout,
        AsyncCallback callback,
        object state);

    int EndRead(
        IAsyncResult asyncResult);

    int Read(
        byte[] buffer,
        int offset,
        int size,
        TimeSpan timeout);
}

这显然是一个经典的生产者-消费者问题:字节通过调用回调方法产生,并由 Begin/EndRead 和 Read 方法消耗。如果没有可用数据,Begin/EndRead 和 Read 方法应该阻塞(直到发生超时)。实现应使用固定大小的内部缓冲区,因此回调方法需要在缓冲区当前已满时阻塞。

考虑到多线程通常会让人头疼,我的问题是:是否已经实现了这样的数据结构?

(我认为实现 Read 方法应该很简单,但我想避免用 Read.Begin/EndInvoke 实现 Begin/EndRead。)

最佳答案

是否必须通过 IAsyncResult 进行异步?我有一个通用阻塞队列here (即读者阻塞直到有数据或关闭;写入者阻塞直到有空间);它没有专门针对 byte[] 进行优化,但只要大小不是很大,它应该可以应付 - 但作为一个阻塞队列,它需要(至少一个)专用的消费者线程,做:

T val;
while(queue.TryDequeue(out val)) {
    // process val
}

关于c# - 线程安全的异步字节队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/893327/

相关文章:

c# - 如何从 JavaScript 调用服务器端函数?

c# - Framework/Framework64 和 System32/Syswow64

c# - 可观察的取消标记

c# - 如何使用存储过程在 LINQ to SQL 中使用事务?

java - 使用 JADE 和 Excel 的问题

c# - 在C#中使用TPL在生产者-消费者模式中进行异常处理

c# - 以下方法或属性之间的调用不明确(错误??)

c# - 在 C# 的接口(interface)内使用 'new' 关键字意味着什么?

c# - 使用WasapiOut Naudio更改声卡的采样率

python - 为什么 PyGILState_Release(...) 在这种情况下会出现段错误?