多个异步请求同步

问题描述:

我正在开发一个Silverlight应用程序,它可以向多个Web服务发出多个异步请求。我希望模式“加载”对话框保持活动状态,直到所有请求都完成。我通过使用一个计数器变量来管理这种情况,该变量在每个异步请求开始事件上递增,并在每个异步完成事件上递减(对我来说似乎不是线程安全的)。当计数器为零时,绑定到UI的属性会关闭对话框。有没有比我的解决方案更好/更一般的处理这个问题的方法?多个异步请求同步

您的柜台解决方案是一个有效的解决方案。无论你做什么,你都必须跟踪你的所有请求,并了解他们何时到达(当计数达到零)。

你可以做不同的事情来清理你的代码,比如把所有这个实现放在一些MultiAsyncWaiter类中,这个类在完成时返回一个事件。但基本的暗示将保持不变:追踪它们直到它们全部返回。

你说得对int的线程不安全。如果您使用互锁操作(请参阅注释)或锁定该变量,则可以保证实现线程安全。

为什么volatile关键字不能工作:在多个线程更改变量的情况下,递减需要一个互锁操作,这在技术上是一个读写操作。这是因为另一个线程可以更改读取和写入之间的值。

+1

使int变得不稳定 - 您需要使用Interlocked.Increment和.Decrement来确保您不会丢失更新(http://msdn.microsoft.com/zh-cn/library/dd78zt0c .aspx) – 2009-12-17 21:02:12

+0

谢谢,更新了答案。 – santosc 2009-12-18 00:26:42

+0

感谢您的回答;我发现了有关Silverlight的Rx框架,并在IObservable接口上使用了ForkJoin()方法(这是相当了不起的东西,请查看http://www.minddriven.de/?p=563&cpage= 1条#评论-4425) – gn22 2009-12-18 21:48:30