我的AutoResetEvent代码有什么问题?

时间:2009-11-17 15:39:43

标签: c# .net autoresetevent

我有这个代码看起来非常简单,但AutoResetEvent永远不会发出信号。似乎没有什么东西从Web服务返回,而WaitAll只是在十秒后超时。一切正常,没有线程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();
    }

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

另外,qid是正确的 - 你也太晚了你的事件处理程序......所以这里有两个不同的错误。

答案 2 :(得分:1)

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

检查here