У меня есть этот код, который кажется довольно простым, но 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();
}
Какая глупая колбаса (!) Допустим, я написал обработчики правильно. – Paul
Хорошо, я пробовал исправлять обработчики ... той же проблемой. – Paul
Если это веб-сервис, вы должны иметь возможность настраивать Wireshark и проверять, работает ли он правильно; можете ли вы подтвердить, что ответы возвращаются? Если они есть, попробуйте установить контрольные точки в методах обратного вызова и посмотреть, сделаете ли вы его там. В основном просто попробуйте проверить каждый шаг по пути, который вы можете, пока не увидите, где он развалится. – qid