WaitHandle - Silverlight
От: Аноним  
Дата: 16.08.11 12:35
Оценка:
Привет!

Есть такой вот код


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 не попадает.
Убираю ивенты — всё ок.
Что не так?
Re: WaitHandle - Silverlight
От: Rn Россия  
Дата: 17.08.11 14:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет!

А>Есть такой вот код
                //wait while all data loaded
                WaitHandle.WaitAll(autoLoadEvents);

А>почему-то когда добавляю логику с евентами и WaitHandle.WaitAll(autoLoadEvents);
А>перестает работать — ни эксепшена ни в Completed не попадает.
А>Убираю ивенты — всё ок.
А>Что не так?

Ты завешиваешь основной поток.
Пробуй запустить весь код в отдельном потоке и там уже ждать хэндлы,
а для обновления UI используй
Deployment.Current.Dispatcher.BeginInvoke(() =>{ тут });
DOCTRINA MULTIPLEX, VERITAS UNA.
Re[2]: WaitHandle - Silverlight
От: Аноним  
Дата: 17.08.11 17:59
Оценка:
Здравствуйте, 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>


хорошо — завешиваю. но я ведь жду окончания выполнения. стандартное вроде.
или вся фишка в том, что у меня асинхронность?
Re[3]: WaitHandle - Silverlight
От: Rn Россия  
Дата: 18.08.11 06:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 а не поток.
DOCTRINA MULTIPLEX, VERITAS UNA.
Re: WaitHandle - Silverlight
От: DmitryMS  
Дата: 14.09.11 15:22
Оценка:
посмотрите на вот это:
http://www.silverlightshow.net/items/Using-Reactive-Extensions-in-Silverlight.aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.