public HistoricalExecutionSource(BitFlyerClient client, BfProductCode productCode, long before, long after, long readCount = ReadCountMax) { readCount = Math.Min(readCount, ReadCountMax); _source = Observable.Create <IBfExecution>(observer => { return(Task.Run(async() => { while (true) { var resp = client.GetExecutions(productCode, ReadCountMax, before, 0); if (resp.IsError) { switch (resp.StatusCode) { case HttpStatusCode.BadRequest: // no more records observer.OnCompleted(); return; case HttpStatusCode.InternalServerError: await Task.Delay(30 * 1000); // Probably server is in maintanace. wait 30 secs break; } continue; } var elements = resp.GetContent(); foreach (var element in elements) { if (_cancel.IsCancellationRequested) { observer.OnCompleted(); return; } if (element.ExecutionId <= after) { observer.OnCompleted(); return; } observer.OnNext(element); } before = elements.Last().ExecutionId; } })); }); }