Как получать обратные вызовы с помощью Rx.NET? - PullRequest
0 голосов
/ 31 декабря 2018

Предположим, у меня есть 3 студенческих идентификатора.

Что я хочу сделать:

  1. Асинхронно извлекать информацию о студентах 3.
  2. Если обратный вызов не приходит в течение 4 секунд, он будет повторяться три раза дляэтот сетевой вызов.

    Вот мой код:

    Dictionary<string, SemaphoreSlim> semaphoreSlims = new Dictionary<string, 
    SemaphoreSlim>  
    {
        { "1", new SemaphoreSlim(0, 1) },
        { "2", new SemaphoreSlim(0, 1) },
        { "3", new SemaphoreSlim(0, 1) }
    };
    
    IObservable<string> studentIds = new string[] {"1", "2", "3"}.ToObservable();
    
    private IObservable<Student> LoadStudent(string id) {
        return Observable.Create<Student>(
            async o =>
            {
                StudentFoundDelegate studentDetailHandler = (Student student) =>
                {
                     // callback found
                     semaphoreSlims[id].Release();
                     o.OnNext(student);
                };
    
                StudentNotFoundDelegate errorHandler = (string representation, Result eCode) =>
                {
                     // callback found
                    semaphoreSlims[id].Release();
                    o.OnError(new Exception("Student Not Found"));
                };
    
                // Api calls
                StudentManager.Instance.GetStudentDetail(id, studentDetailHandler, errorHandler);
    
                await semaphoreSlims[id].WaitAsync();
    
                return Disposable.Empty;
            });
     }
    
     Observable.Timeout(studentIds.SelectMany(id => LoadStudent(id)), TimeSpan.FromMilliseconds(4000))
             .SubscribeOn(ThreadPoolScheduler.Default)
             .Retry(3)
             .Subscribe(
                student =>
                {
                    Logger.LogMessage("Found Student "+ student);
                },
    
                (ex) =>
                {
                    Logger.LogMessage(ex + "");
                }
     );
    

Но я не получаю никаких обратных вызовов.Может кто-нибудь подсказать, где я не прав и как правильно с этим справиться.Спасибо.

...