2009-05-21 102 views
3

我已经得到了被称为每当新的数据是可用的回调方法:线程安全异步字节队列

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方法应该是相当简单的,但我想,以避免执行开始/ EndRead与读取。Begin/EndInvoke

回答

0

我认为你应该做的“谷歌搜索无锁队列“。我以这种方式获得了大量有用的点击量。

1

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

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

这就是我正在寻找,我认为应该可以修改这个以优化字节[]。不幸的是,该接口需要我实现Begin/EndRead方法...... – dtb 2009-05-21 15:06:33