【问题标题】:Thread-safe async byte queue线程安全的异步字节队列
【发布时间】:2010-10-27 22:59:36
【问题描述】:

我有一个回调方法,每当有新数据可用时就会调用它:

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。Begin/EndInvoke。)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这就是我要找的东西,我认为应该可以修改它以针对 byte[] 进行优化。不幸的是,该接口还要求我实现 Begin/EndRead 方法...
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2016-03-12
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多