Вызов 3 асинхронных веб-сервисов и ожидание их завершения - PullRequest
0 голосов
/ 05 августа 2010

На моей странице Silverlight, когда пользователь нажимает кнопку;Приложение вызывает 3 асинхронных веб-сервисов.Он должен либо дождаться завершения этих 3 асинхронных вызовов, либо должен быть уведомлен о завершении этих вызовов.После того, как эти 3 вызова завершены, результаты будут записаны в текстовый файл (это приложение вне браузера с повышенным доверием).Помимо написания таймера и опроса этих вызовов, есть ли лучший способ получать уведомления о завершении вызовов?

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Библиотека Reactive Extensions (Rx) идеально подходит для этого.Взгляните сюда:

http://www.jaylee.org/post/2010/06/22/WP7Dev-Using-the-WebClient-with-Reactive-Extensions-for-Effective-Asynchronous-Downloads.aspx

Прокрутите вниз.Вот пример ожидания двух загрузок веб-клиента, просто замените логику здесь:

public IObservable<string> StartDownload(string uri)
{
    WebClient wc = new WebClient();

    var o = Observable.FromEvent<DownloadStringCompletedEventArgs>(wc, "DownloadStringCompleted")

                      // Let's make sure that we're not on the UI Thread
                      .ObserveOn(Scheduler.ThreadPool)

                      // When the event fires, just select the string and make
                      // an IObservable<string> instead
                      .Select(newString => ProcessString(newString.EventArgs.Result));

    wc.DownloadStringAsync(new Uri(uri));

    return o;
}

public string ProcessString(string s)
{
    // A very very very long computation
    return s + "<!-- Processing End -->";
}

public void DisplayMyString()
{
    var asyncDownload = StartDownload("http://bing.com");
    var asyncDownload2 = StartDownload("http://google.com");

    // Take both results and combine them when they'll be available
    var zipped = asyncDownload.Zip(asyncDownload2, (left, right) => left + " - " + right);

    // Now go back to the UI Thread
    zipped.ObserveOn(Scheduler.Dispatcher)

          // Subscribe to the observable, and set the label text
          .Subscribe(s => myLabel.Text = s);
}
0 голосов
/ 05 августа 2010

Когда вы вызываете вызов веб-службы, вы передаете обратный вызов - поэтому вы автоматически будете уведомлены о завершении вызовов.

Для отслеживания завершения вы можете использовать параметр object asyncState в beginXXX.звонки для отслеживания каждого звонка, или вы можете использовать счетчик вверх / вниз целое число.

Попробуйте это: http://msdn.microsoft.com/en-us/library/cc197937(v=VS.95).aspx

...