У меня есть метод обратного вызова, который вызывается всякий раз, когда новые данные:поточно-очередь асинхронных байт
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
.)
Вот что я «Я ищу, и я думаю, что это должно быть возможно изменить, чтобы быть оптимизированным для байт []. К сожалению, интерфейс требует, чтобы я реализовал методы Begin/EndRead ... – dtb