如何在silverlight中处理异步数据接收

本文关键字:异步 数据 处理 silverlight | 更新日期: 2023-09-27 18:24:37

我有一个复选框列表,每次用户选择一个项目时,我的ViewModel都会要求我的服务发送与该选项相关的数据。

_myService.GetAssetSpotDataCompleted += GetAssetSpotDataCompleted;
_myService.GetAssetSpotDataAsync(descItem);

每个选定的项都将调用相同的服务方法并调试它发送回的正确数据的服务。

当用户在我的ViewModel中仍未收到数据的情况下检查某些项目时,就会出现我的问题。示例:用户选择项目1和项目2,但我的viewModel仍然没有来自服务的答案。

当我的ViewModel收到信息时,问题来了,我总是在e.Result.中收到两倍相同的数据

这意味着它进入方法GetAssetSpotDataAsync两次,但总是具有相同的结果,而不是针对项目1然后针对项目2的结果。

我已经调试了所有的东西,并将问题集中在方法GetAssetSpotDataCompleted:的前两行中

 ((MyServiceClient)sender).GetAssetSpotDataCompleted -= GetAssetSpotDataCompleted;
            if (e.Result != null)

有人能帮我吗?

如何在silverlight中处理异步数据接收

实际情况是,当对第一个请求的响应到达时,服务发现有两个委托在侦听GetAssetSpotDataCompleted(一个是在发出请求时添加的,另一个是当发出第二个仍然未完成的请求时添加)。

它将调用两个委托,它无法知道第二个委托只用于第二个未完成的请求。当调用第一个时,其代码会从事件中删除其中一个委托。当调用第二个时,它也会删除剩下的委托,使GetAssetSpotDataCompleted为null。

现在,当第二个请求最终完成时,服务发现GetAssetSpotDataCompleted事件为空,并且什么也不做。

一种解决方案是只添加一次事件处理程序,可能与在ViewModel中分配_myService的时间相同。

然而,可能还有另一个问题,无法保证对两个未完成请求的响应将以发送时的相同顺序到达(尽管它们很可能会到达)。最好将IsBusy布尔属性添加到ViewModel中,并在发出未完成请求时设置此true,并在完成时将其清除。将此属性绑定到BusyIndicator控件(可在Toolkit中找到)。这将阻止用户交互,同时将最终改变UI状态的异步操作正在进行中。