在我的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,这就是我需要异步调用服务的原因。我认为我不能使用后台工作者。答案 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);
}