private async void FetchMessages(CancellationToken token, Func <IEvent, Task> dispatcher, Action <Exception> onError, Action onCompleted, IMessageReader reader, long from) { var current = from; while (!token.IsCancellationRequested) { IMessageResult result; try { result = await reader.GetMessagesAsync(token, current, 500); } catch (Exception e) { onError(e); token.WaitHandle.WaitOne(1000 * 20); continue; } if (result.HasMessages()) { foreach (var message in result.Messages) { _infoLogger(string.Format("Received message {1} on stream {0}", _stream, message)); IEvent @event; try { @event = _deserializer(message.Value); _infoLogger(string.Format("Received event {1} on stream {0}", _stream, @event.GetType())); } catch (Exception e) { onError(e); continue; } await dispatcher(@event); } current = result.NextOffset; _checkpointWriter.Update(current); } } onCompleted(); }