public T ProcessData <T>(Func <DataInfo, T> dataProcessFunc) { T value; lock (syncRoot) { value = dataProcessFunc(dataInfo); if (!EOF() && dataInfo.Offset == buffer.GetBlock(consumerId).Length) { dataInfo.Advance(); } } return(value); }