我正在开发一个Silverlight应用程序,它可以向多个Web服务发出多个异步请求。我想要一个模态“加载”对话框保持活动状态,直到所有请求都完成。我通过使用在每个异步请求启动事件上递增的计数器变量来管理这种情况,并在每个异步完成事件上递减(对我来说似乎不是线程安全的)。当计数器为零时,绑定到UI的属性会关闭对话框。与我的反制解决方案相比,是否有更好/更一般的方法来处理这个问题?
答案 0 :(得分:0)
您的反制解决方案是有效的。无论你做什么,你都必须跟踪你的所有要求,并了解它们何时到达(当计数达到零时)。
您可以执行不同的操作来清理代码,例如将所有此实现放在某个MultiAsyncWaiter类中,该类在完成时返回事件。但基本的实施将保持不变:跟踪它们直到它们都返回。
你对int的线程不安全感是正确的。如果使用互锁操作(请参阅注释)或锁定变量,则可以保持实现线程安全。
为什么volatile关键字不起作用:当多个线程更改变量时,递减需要一个互锁操作,这在技术上是一个读/写操作。这是因为另一个线程可以更改读取和写入之间的值。