代码之家  ›  专栏  ›  技术社区  ›  gn22

多异步请求同步

  •  3
  • gn22  · 技术社区  · 16 年前

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

    1 回复  |  直到 16 年前
        1
  •  0
  •   santosc    16 年前

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

    您可以做不同的事情来清理代码,比如将所有实现放在某个MultiAsyncWater类中,该类在完成时返回一个事件。但基本的实施方式将保持不变:跟踪它们,直到它们全部返回。

    关于int的线程不安全性,您是对的。如果您对变量使用联锁操作(请参阅注释)或锁定,则可以保持实现线程安全。

    为什么volatile关键字不起作用:当多个线程更改变量时,减量需要一个联锁操作,从技术上讲,这是一个读写操作。这是因为另一个线程可以更改读取和写入之间的值。