2009-11-17 22 views
0

我有這樣的代碼,這似乎很直接,但AutoResetEvent永遠不會得到信號。似乎沒有任何東西從Web服務返回,並且WaitAll在十秒後才超時。一切正常,沒有線程jiggerypokery,所以它不是一個Web服務問題。我究竟做錯了什麼?我的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 2009-11-17 16:34:00

+0

好吧,我試着糾正處理程序...同樣的問題。 – Paul 2009-11-17 16:34:59

+0

如果這是一個Web服務,你應該可以裝配Wireshark並驗證它是否正常工作;你能證實答覆回來了嗎?如果是,請嘗試在回調方法中設置斷點並查看是否在該處設置斷點。基本上只是試圖檢查你可以一路走過的每一步,直到你看到它分崩離析。 – qid 2009-11-17 17:48:31

1

這些是AutoResetEvent對象 - 看起來像你想要一個ManualResetEvent - 自動版本觸發任何等待,但立即重置。手動的保持觸發狀態,所以如果在到達WaitAll之前發生回調,它就會立即失效。

此外,qid是正確的 - 你也附加你的事件處理程序也太晚了...所以這裏有兩個不同的錯誤。

+0

我認爲這可能也是如此 - 但根據MSDN文檔,該事件只有在它發出線程信號後纔會重置。 – Aaron 2009-11-17 15:54:17

+0

哦,你是對的 - 傻我。 qid可能有答案,然後 – Clyde 2009-11-17 16:27:19

+0

好吧,我試着糾正處理程序...同樣的問題。 – Paul 2009-11-17 16:35:31

1

您是否在使用STA屬性標記的線程(例如主UI線程)上使用此代碼?如果是這樣,這些線程不支持WaitAll方法。

檢查here