在循环中异步调用WCF服务

时间:2009-02-11 16:59:51

标签: wcf multithreading

在我的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 结尾处显示一条消息。

有什么想法吗?

编辑:我可能将其移植到Silverlight,这就是我需要异步调用服务的原因。我认为我不能使用后台工作者。

3 个答案:

答案 0 :(得分:2)

我会在WPF窗口中添加一个线程安全字段,以跟踪用户排队的客户端更新数量:

private int recordsQueued = 0;

在分派单个异步操作之前,请将recordsQueued设置为someCollection.Count。

recordsQueued = someCollection.Count;

最后,在client_UpdateRecordsCompleted中,递减recordsQueued;如果为零,则显示“更新完成”消息:

private void client_UpdateRecordsCompleted(AsyncCompletedEventArgs args) {
  if (Interlocked.Decrement(ref recordsQueued) == 0)
    MessageBox.Show("Update complete.");      
}

答案 1 :(得分:2)

如果您不希望用请求压倒您的服务器,则另一种方法是使用后台工作程序,在具有同步请求的正常循环中完成所有工作。后台工作程序已经有报告进度和完成的方法,可以方便地在正确的线程上向主应用程序报告。假设您想要使用GUI进行操作而不是仅显示完整的对话框。

答案 2 :(得分:2)

也许是这样:

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);
}