我有这个代码看起来非常简单,但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();
}
答案 0 :(得分:2)
我可以提供一个天真的初步猜测:看起来你在调用启动异步操作的方法后添加了事件处理程序;那里可能存在竞争条件或其他一些问题。你可以切换操作顺序,以便附加事件处理程序,然后开始操作吗?
答案 1 :(得分:1)
这些是AutoResetEvent对象 - 看起来你想要一个ManualResetEvent - 自动版本会触发任何等待,但会立即重置。手动触发,所以如果在你到达WaitAll之前发生回调,它就会立即失效。
另外,qid是正确的 - 你也太晚了你的事件处理程序......所以这里有两个不同的错误。
答案 2 :(得分:1)
您是否在使用STA属性标记的线程上使用此代码,例如主UI线程?如果是这样,这些线程不支持WaitAll方法。
检查here。