【问题标题】:Whats wrong with my AutoResetEvent code?我的 AutoResetEvent 代码有什么问题?
【发布时间】:2009-11-17 15:39:43
【问题描述】:

我有这段代码,看起来很简单,但 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();
    }

【问题讨论】:

    标签: c# .net autoresetevent


    【解决方案1】:

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

    【讨论】:

    • 多么愚蠢的香肠(!)假设我已经以正确的方式编写了处理程序。
    • 如果这是一个网络服务,你应该能够安装 Wireshark 并验证它是否正常工作;你能验证回复是否回来了吗?如果是,请尝试在回调方法中设置断点,看看是否在那里。基本上只是尝试检查沿途的每一步,直到你看到它崩溃的地方。
    • 网络服务没有问题,如果我删除所有自动事件内容,它们会正确终止......只是没有同步。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为也可能是这种情况 - 但根据 MSDN 文档,事件仅在发出线程信号后才会重置。
    • 哦,你说得对——我真傻。 qid 可能有答案,那么
    【解决方案3】:

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

    检查here

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多