2009-11-17 82 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