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

时间:2012-02-14 12:39:26

标签: c# silverlight

我有一个复选框列表,每次用户选择一个项目时,我的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)

任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

正在发生的事情是,当第一个请求的响应到达时,服务发现有两个代表正在监听GetAssetSpotDataCompleted(一个是在发出请求时添加了另一个,当第二个仍然未完成的请求发出时)

它将调用两个代理,它无法知道第二个代表仅用于第二个未完成的请求。当第一个被调用时,其代码将从事件中删除其中一个委托。当第二个被调用时,它也会删除剩余的委托,将GetAssetSpotDataCompleted保留为空。

现在,当第二个请求最终完成时,服务发现GetAssetSpotDataCompleted事件为空且不执行任何操作。

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

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