我有一个回调方法,只要有新数据就会调用它:
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。)
答案 0 :(得分:1)
是否必须通过IAsyncResult
进行异步处理?我有一个通用的阻塞队列here(即读者阻塞直到有数据或它被关闭;写入器阻塞直到有空间);它没有专门针对byte[]
进行优化,但只要大小不大就应该应对 - 但作为阻塞队列,它需要(至少一个)专用的消费者线程,这样做:
T val;
while(queue.TryDequeue(out val)) {
// process val
}
答案 1 :(得分:0)
我认为你应该在“无锁队列”上进行谷歌搜索。我有很多有用的点击方式。