0

我有这段代码,看起来很简单,但 AutoResetEvent 永远不会收到信号。Web 服务似乎没有返回任何内容,并且 WaitAll 仅在 10 秒后超时。没有线程 jiggerypokery 一切正常,所以它不是 Web 服务问题。我究竟做错了什么?

    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();
    }
4

3 回答 3

2

我可以提供一个幼稚的第一个猜测:看起来您是在调用启动异步操作的方法之后添加事件处理程序;那里可能存在竞争条件或其他问题。您能否切换操作顺序以便附加事件处理程序,然后开始操作?

于 2009-11-17T15:48:48.750 回答
1

这些是 AutoResetEvent 对象——看起来你想要一个 ManualResetEvent——自动版本会触发任何等待,但会立即重置。手动的保持触发,所以如果回调发生在你到达 WaitAll 之前,它会立即失败。

此外,qid 是正确的——您附加事件处理程序的时间也太晚了……所以这里有两个不同的错误。

于 2009-11-17T15:51:24.683 回答
1

您是否在标有 STA 属性的线程上使用此代码,例如主 UI 线程?如果是这样,则这些线程不支持 WaitAll 方法。

在这里检查。

于 2009-11-17T21:03:48.327 回答