У меня есть метод обратного вызова, который вызывается при появлении новых данных:
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 должна быть довольно простой, но я бы хотел избежать реализации Begin / EndRead с Read. Begin
/ EndInvoke
.)