Привет!
Есть такой вот код
try
{
AutoResetEvent[] autoLoadEvents = new AutoResetEvent[3];
for (int i = 0; i < autoLoadEvents.Count(); i++) autoLoadEvents[i] = new AutoResetEvent(false);
var selDate = cldCurrentMonth.SelectedDate ?? DateTime.Now;
//time periods
BookTimePeriodDomainContext bookTimeCtx = new BookTimePeriodDomainContext();
var timePeriodsQuery = bookTimeCtx.Load(bookTimeCtx.GetBookTimePeriodsQuery());
timePeriodsQuery.Completed += (send, args) =>
{
var timePeriod = timePeriodsQuery.Entities.Single();
ScheduleTimePeriods = ObtainTimePeriods(selDate, timePeriod);
//
//set time periods loaded
autoLoadEvents[0].Set();
};
//cars
CarDomainContext carCtx = new CarDomainContext();
var loadCarsQuery = carCtx.Load(carCtx.GetCarsQuery());
loadCarsQuery.Completed += (send, args) =>
{
Cars = loadCarsQuery.Entities.ToList();
//
//set cars loaded
autoLoadEvents[1].Set();
};
TaskDomainContext taskCtx = new TaskDomainContext();
var loadTasksQuery = taskCtx.Load(taskCtx.GetTasksQuery());
loadTasksQuery.Completed += (send, args) =>
{
Tasks = loadTasksQuery.Entities.ToList();
//
//set tasks loaded
autoLoadEvents[2].Set();
};
//wait while all data loaded
WaitHandle.WaitAll(autoLoadEvents);
PopulateDataGrid();
}
catch (Exception exc)
{
}
почему-то когда добавляю логику с евентами и WaitHandle.WaitAll(autoLoadEvents);
перестает работать — ни эксепшена ни в Completed не попадает.
Убираю ивенты — всё ок.
Что не так?
Здравствуйте, Аноним, Вы писали:
А>Привет!
А>Есть такой вот код
//wait while all data loaded
WaitHandle.WaitAll(autoLoadEvents);
А>почему-то когда добавляю логику с евентами и WaitHandle.WaitAll(autoLoadEvents);
А>перестает работать — ни эксепшена ни в Completed не попадает.
А>Убираю ивенты — всё ок.
А>Что не так?
Ты завешиваешь основной поток.
Пробуй запустить весь код в отдельном потоке и там уже ждать хэндлы,
а для обновления UI используй
Deployment.Current.Dispatcher.BeginInvoke(() =>{ тут });
Здравствуйте, Rn, Вы писали:
Rn>Здравствуйте, Аноним, Вы писали:
А>>Привет!
А>>Есть такой вот код
Rn>Rn> //wait while all data loaded
Rn> WaitHandle.WaitAll(autoLoadEvents);
Rn>
А>>почему-то когда добавляю логику с евентами и WaitHandle.WaitAll(autoLoadEvents);
А>>перестает работать — ни эксепшена ни в Completed не попадает.
А>>Убираю ивенты — всё ок.
А>>Что не так?
Rn>Ты завешиваешь основной поток.
Rn>Пробуй запустить весь код в отдельном потоке и там уже ждать хэндлы,
Rn>а для обновления UI используй
Rn>Rn>Deployment.Current.Dispatcher.BeginInvoke(() =>{ тут });
Rn>
хорошо — завешиваю. но я ведь жду окончания выполнения. стандартное вроде.
или вся фишка в том, что у меня асинхронность?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Rn, Вы писали:
А>хорошо — завешиваю. но я ведь жду окончания выполнения. стандартное вроде.
А>или вся фишка в том, что у меня асинхронность?
Чтобы послать Completed нужно в основном потоке код выполнить.
это станет проще когда выйде await async
http://blogs.msdn.com/b/kylemc/archive/2010/11/02/using-the-visual-studio-async-ctp-with-ria-services.aspx
но трувей — делать асинхроноо и вешать на UI busyindicator а не поток.