Вызов службы WCF асинхронно в цикле - PullRequest
1 голос
/ 11 февраля 2009

В моем клиенте WPF у меня есть цикл, который вызывает службу WCF для обновления некоторых записей. Когда цикл завершен, я отображаю сообщение «Обновление завершено».

Теперь я изменяю свои вызовы WCF на асинхронные.

    ServiceClient client = new ServiceClient();
    client.UpdateRecordsCompleted +=new System.EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_UpdateRecordsCompleted);

    foreach (MyItem item in someCollection)
    {
         client.UpdateRecordsAsync(item);
    } 

    MessageBox.Show("Update complete");

Мне не нужно ничего делать в соревновательном событии каждой операции. Мне нужно просто отобразить сообщение в конце last one.

Есть идеи?

РЕДАКТИРОВАТЬ: Я могу перенести это на Silverlight, поэтому мне нужно вызвать службу асинхронно. Я не думаю, что смогу использовать фонового работника.

Ответы [ 3 ]

2 голосов
/ 11 февраля 2009

Если вы не хотите перегружать свой сервер запросами, другим подходом будет использование фонового работника, выполняйте всю свою работу в обычном цикле с синхронными запросами. У фонового работника уже есть методы для отчета о прогрессе и завершении, которые удобны, чтобы сообщить в основное приложение в правильном потоке. Предполагая, что вы хотите что-то делать с вашим графическим интерфейсом, а не просто показывать полный диалог.

2 голосов
/ 11 февраля 2009

Возможно вот так:

ServiceClient client = new ServiceClient();
var count = someCollection.Count;
client.UpdateRecordsCompleted += (_,__) => {
    if (Interlocked.Decrement(ref count) == 0) {
        MessageBox.Show("Update complete.");   
    }
}

foreach (MyItem item in someCollection)
{
     client.UpdateRecordsAsync(item);
} 
2 голосов
/ 11 февраля 2009

Я бы добавил потокобезопасное поле в ваше окно WPF, чтобы отслеживать количество клиентских обновлений, поставленных пользователем в очередь:

private int recordsQueued = 0;

Перед отправкой отдельных асинхронных операций, установите для recordsQueued значение someCollection.Count.

recordsQueued = someCollection.Count;

Наконец, в client_UpdateRecordsCompleted, уменьшить количество записейQueued; если он равен нулю, отобразить сообщение «Обновление завершено»:

private void client_UpdateRecordsCompleted(AsyncCompletedEventArgs args) {
  if (Interlocked.Decrement(ref recordsQueued) == 0)
    MessageBox.Show("Update complete.");      
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...