线程安全的异步字节队列

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/EndInvoke来实现Begin/EndRead。)
2个回答

1

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

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

这正是我要找的内容,我认为可以将其修改为针对byte[]进行优化。不幸的是,接口要求我实现Begin/EndRead方法... - dtb

0

我认为你应该在谷歌上搜索“无锁队列”。这样我得到了很多有用的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接