线程安全的异步字节队列

时间:2009-05-21 14:50:26

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

我有一个回调方法,只要有新数据就会调用它:

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

我想将它包装在一个实现类似于此的接口的类中:

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。)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我认为你应该在“无锁队列”上进行谷歌搜索。我有很多有用的点击方式。