2012-02-14 4 views
1

사용자가 하나의 항목을 선택할 때마다 내 ViewModel이 내 서비스에서 해당 옵션과 관련된 데이터를 보내도록 요청하는 체크 박스 목록을 가지고 있습니다.Silverlight에서 비동기 데이터 수신을 처리하는 방법은 무엇입니까?

_myService.GetAssetSpotDataCompleted += GetAssetSpotDataCompleted; 

_myService.GetAssetSpotDataAsync(descItem); 

선택한 각 항목은 동일한 서비스 메서드를 호출하고 올바른 데이터를 다시 보내는 서비스를 디버깅합니다.

내 ViewModel에서 데이터를 아직받지 못한 상태에서 사용자가 일부 항목을 검사하면 내 문제가 나타납니다. 예 : 사용자가 항목 1과 항목 2를 선택했지만 내 viewModel에 서비스의 응답이 아직 없습니다.

내 ViewModel에서 정보가 수신되면 문제가 발생하므로 항상 e.Result에서 동일한 데이터가 두 번 수신됩니다. 대신 항목 1의 결과와 동일한 결과로 두 번 있지만 항상 방법 GetAssetSpotDataAsync에 입력 한 후 나는 모든 디버깅 한 2

항목에 대해 내가 문제에 초점을 맞춘 것을 의미

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

사람이 나에게 도움이 될 수 있습니다 방법 GetAssetSpotDataCompleted 이러한 처음 두 줄?

+0

사용자가 항목을 선택할 때마다 이벤트 처리기를 추가/제거해야합니까? 하나의 선언 만 있으면 충분합니다. – mslliviu

답변

0

첫 번째 요청에 대한 응답이 도착할 때까지 서비스에서는 GetAssetSpotDataCompleted (두 번째 아직 해결되지 않은 요청이 만들어 졌을 때 요청이 만들어 졌을 때 하나가 추가됨)을 수신하는 두 명의 위임자를 찾습니다.

두 대리자를 모두 호출하므로 두 번째 대리인이 두 번째 해결되지 않은 요청에 대해서만 의미가 있음을 알 수 없습니다. 첫 번째 코드가 호출되면 코드는 이벤트에서 대리자 중 하나를 제거합니다. 두 번째가 호출되면 GetAssetSpotDataCompleted을 null로 남겨둔 나머지 대리자도 제거합니다.

이제 두 번째 요청이 완료되면 서비스는 GetAssetSpotDataCompleted 이벤트가 null이고 아무 것도 수행하지 않습니다.

한 가지 해결책은 이벤트 핸들러를 한 번만 추가하는 것입니다. 아마도 _myService이 ViewModel에 할당되는 것과 같습니다.

하지만 다른 문제가있을 수 있습니다. 두 가지 해결되지 않은 요청에 대한 응답이 전송 된 순서대로 도착할 것이라고 보장 할 수는 없습니다 (가능할 확률이 높지만). IsBusy 부울 속성을 ViewModel에 설정하고 해결되지 않은 요청이 완료되면이 값을 true으로 설정하고 완료되면이 값을 지운다. 이 속성을 BusyIndicator 컨트롤 (Toolkit에 있음)에 바인딩하십시오. UI의 상태를 궁극적으로 변경하는 비동기 작업이 진행되는 동안 사용자 상호 작용을 방지합니다.

관련 문제