Предположим, у меня есть 3 студенческих идентификатора.
Что я хочу сделать:
- Асинхронно извлекать информацию о студентах 3.
Если обратный вызов не приходит в течение 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 + "");
}
);
Но я не получаю никаких обратных вызовов.Может кто-нибудь подсказать, где я не прав и как правильно с этим справиться.Спасибо.