4

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

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/EndRead BeginEndInvoke

4

2 回答 2

1

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

T val;
while(queue.TryDequeue(out val)) {
    // process val
}
于 2009-05-21T15:00:20.307 回答
0

我认为您应该在“无锁队列”上进行谷歌搜索。这样我得到了很多有用的命中。

于 2009-05-21T14:59:07.033 回答