В моем веб-приложении ASP.net у меня есть код в Page_Init event() моей страницы, который проверяет некоторые переменные сеанса для перенаправления пользователей, если произошел тайм-аут сеанса.
В моем приложении Silverlight у меня есть обработчик событий кнопки, который выполняет асинхронный код ESRI ArcGIS и который настраивает обработчик событий, который срабатывает при завершении асинхронного вызова:
QueryTask queryTask = new QueryTask(myLayer.Url + "/" + layerID);
queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryCountyTask_ExecuteCompleted);
queryTask.ExecuteAsync(query);
Существует также немного кода, который вызывает функцию JavaScript на странице, чтобы скрыть панель. Включение этого кода приводит к возврату полной страницы.
HtmlPage.Window.Invoke("hideReport");
Моя проблема в том, что иногда событие RequestCountyTask_ExecuteCompleted() Silvelright срабатывает перед событием Page_Init(), а иногда оно срабатывает после. В тех случаях, когда Silverlight срабатывает перед событием "Страница", состояние сеанса пуст, в результате чего пользователь неправильно перенаправляется на страницу "ваша сессия имеет тайм-аут". Пока событие Silverlight запускается после события страницы, переменные сеанса все еще присутствуют, и все работает нормально.
Похоже, что размещение метода Invoke не влияет на то, когда вызывается событие уровня страницы, поэтому порядок событий кажется кажущимся случайным. Есть ли способ упорядочить события, чтобы избежать этих условий гонки?
Есть ли способ координировать эти асинхронные события обратного вызова с обычным жизненным циклом страницы веб-приложения, чтобы избежать этих условий гонки?