2009-11-17 6 views
0

나는이 코드를 매우 간단하게 보이지만 AutoResetEvent는 결코 신호를받지 못한다. 웹 서비스에서 반환 된 것으로 보이는 것은 없으며 WaitAll은 10 초 후에 종료됩니다. 스레딩 jiggerypokery 없이는 모든 것이 잘 작동하므로 웹 서비스 문제는 아닙니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?내 AutoResetEvent 코드에 문제가 있습니까?

AutoResetEvent[] autoEvents; 
    ObservableCollection<Tx3.ResourceService.ResourceTime> resourceTime; 
    ObservableCollection<Tx3.ResourceService.ResourceTimeDetail> resourceTimeDetail; 

    private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     autoEvents = new AutoResetEvent[] 
     { 
      new AutoResetEvent(false), 
      new AutoResetEvent(false), 
     }; 

     var resourceService = getResourceServiceClient(); 

     // Get ResourceTime data for this user 
     resourceService.ListResourceTimeAsync(CategoryWorkItemId, ResourceId); 
     resourceService.ListResourceTimeCompleted += new EventHandler<Tx3.ResourceService.ListResourceTimeCompletedEventArgs>(resourceService_ListResourceTimeCompleted); 

     // Get ResourceTimeDetails 
     resourceService.ListResourceTimeDetailAsync(CategoryWorkItemId, ResourceId); 
     resourceService.ListResourceTimeDetailCompleted += new EventHandler<ListResourceTimeDetailCompletedEventArgs>(resourceService_ListResourceTimeDetailCompleted); 

     WaitHandle.WaitAll(autoEvents, 10000); 

     System.Diagnostics.Debug.WriteLine("do something with both datasets"); 
    } 

    void resourceService_ListResourceTimeCompleted(object sender, Tx3.ResourceService.ListResourceTimeCompletedEventArgs e) 
    { 
     resourceTime = e.Result; 
     autoEvents[0].Set(); 
    } 

    void resourceService_ListResourceTimeDetailCompleted(object sender, ListResourceTimeDetailCompletedEventArgs e) 
    { 
     resourceTimeDetail = e.Result; 
     autoEvents[1].Set(); 
    } 
내가 순진 첫번째 추측을 제공 할 수 있습니다

답변

2

: 당신이 비동기 작업을 시작 메소드를 호출 한 후 이벤트 처리기를 추가하는 것 같습니다; 거기에 경쟁 조건이 있거나 다른 문제가있을 수 있습니다. 이벤트 처리기를 연결하고 작업을 시작할 수 있도록 작업 순서를 바꿀 수 있습니까?

+0

어리석은 소시지 (!) 나는 핸들러를 올바른 방법으로 작성했다고 가정합니다. – Paul

+0

좋아요, 나는 핸들러를 수정하려고했습니다 ... 똑같은 문제. – Paul

+0

웹 서비스 인 경우 Wireshark를 조작하고 올바르게 작동하는지 확인할 수 있습니다. 응답이 다시 돌아 오는지 확인할 수 있습니까? 그렇다면 콜백 메서드에 중단 점을 설정하고 거기에 있는지 확인하십시오. 기본적으로 모든 단계를 확인할 수있을 때까지 가능한 한 길을 따라가보십시오. – qid

1

다음은 AutoResetEvent 개체입니다. ManualResetEvent가 필요한 것처럼 보입니다. 자동 버전은 대기중인 모든 항목을 트리거하지만 즉시 다시 설정됩니다. 수동 대기 상태가 유지되므로 WaitAll에 도달하기 전에 콜백이 발생하면 즉시 중단됩니다.

또한 정확합니다. 이벤트 처리기를 너무 늦게 부착하고 있습니다 ... 그래서 여기에 두 가지 버그가 있습니다.

+0

나는 그럴 수도 있다고 생각했지만 - MSDN 문서에 따르면 이벤트는 스레드에 신호를 보낸 후에 만 ​​재설정됩니다. – Aaron

+0

아, 네 말이 맞아. 바보 같아. 질문에 답이있을 때 – Clyde

+0

좋아, 핸들러 수정 중 ... 같은 문제가 발생했습니다. – Paul

1

기본 UI 스레드와 같이 STA 특성으로 표시된 스레드에서이 코드를 사용하고 있습니까? 그렇다면 WaitAll 메서드는 이러한 스레드에서 지원되지 않습니다.

체크 here.

관련 문제