2009-11-17 4 views
0

У меня есть этот код, который кажется довольно простым, но AutoResetEvent никогда не сигнализируется. Кажется, что ничто не возвращается из веб-сервисов, а WaitAll просто отключается через десять секунд. Все работает отлично без потокового jiggerypokery, поэтому это не проблема веб-сервиса. Что я делаю не так?Что не так с моим кодом 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

+0

Хорошо, я пробовал исправлять обработчики ... той же проблемой. – Paul

+0

Если это веб-сервис, вы должны иметь возможность настраивать Wireshark и проверять, работает ли он правильно; можете ли вы подтвердить, что ответы возвращаются? Если они есть, попробуйте установить контрольные точки в методах обратного вызова и посмотреть, сделаете ли вы его там. В основном просто попробуйте проверить каждый шаг по пути, который вы можете, пока не увидите, где он развалится. – qid

1

Это объекты AutoResetEvent - похоже, что вы хотите использовать ManualResetEvent - автоматическая версия запускает что-либо в ожидании, но сразу же сбрасывается. Ручные остаются включенными, поэтому, если обратный вызов произойдет до того, как вы дойдете до WaitAll, он сразу же проскочит.

Также, qid верен - вы слишком поздно прикрепляете обработчики событий ... так что здесь происходят две разные ошибки.

+0

Я думал, что это тоже может быть так - но согласно документам MSDN событие сбрасывается только после того, как оно сигнализирует поток. – Aaron

+0

О, ты прав - глупая меня. Вероятно, у qid есть ответ, затем – Clyde

+0

Хорошо, я попытался исправить обработчики ... той же проблемой. – Paul

1

Вы используете этот код в потоке, который отмечен атрибутом STA, например, основной поток пользовательского интерфейса? Если это так, метод WaitAll не поддерживается в этих потоках.

Проверить here.

Смежные вопросы