2009-05-21 5 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 должны блокироваться, если данные недоступны (до тех пор, пока не произойдет тайм-аут). Реализация должна использовать внутренний буфер фиксированного размера, поэтому метод обратного вызова должен блокироваться, когда буфер в настоящий момент заполнен.

Поскольку мышление о многопоточности обычно приводит к сильной головной боли, мой вопрос: Есть ли уже реализация такой структуры данных?

(я думаю, что внедрение метода чтения должен быть достаточно простым, но я хотел бы избежать реализации Начало/EndRead с Read. Begin/EndInvoke.)

ответ

0

Я думаю, что вы должны сделать поиск Google на " блокированная очередь ". Таким образом, у меня много полезных хитов.

1

Должно ли быть асинхронным через IAsyncResult? У меня есть общий блокирующий queue here (то есть читатели блокируют до тех пор, пока не будут данные или они закрыты, авторы блокируют до тех пор, пока не будет пробел); он не оптимизирован специально для byte[], но до тех пор, пока размер не подавляющее он должен справиться - но как очередь блокировки требует (по крайней мере один) выделенный поток-потребитель, делая:

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

Вот что я «Я ищу, и я думаю, что это должно быть возможно изменить, чтобы быть оптимизированным для байт []. К сожалению, интерфейс требует, чтобы я реализовал методы Begin/EndRead ... – dtb

 Смежные вопросы

  • Нет связанных вопросов^_^