コード例 #1
0
        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;
                    }
                }));
            });
        }