У нас есть приложение, у которого есть главное окно, оно может запускать несколько других окон в новых браузерах.Мы используем приложение silverlight в качестве координирующего сервера в главном окне, чтобы закрыть все окна, которые являются частью приложения, независимо от того, как они открываются (мы не можем гарантировать, что это было через window.open, поэтому не всегда имеемдескриптор окна в javascript).
При выходе из системы мы хотим подать сигнал всем другим окнам на автоматическое сохранение, если необходимо, затем закрыть.
Итак, все окнаесть приложение Silverlight, они координируются с использованием местных сообщений сообщений.Однако они асинхронные:
private void ProcessAutosave()
{
foreach (string s in _windows)
{
SendMessage(s, "notify-logout");
}
// code here quoted later...
}
// sendasynch doesn't send until the method terminates, so have to do it in it's own function.
private void SendMessage(string to, string message)
{
var lms = new LocalMessageSender(to);
lms.SendCompleted += new EventHandler<SendCompletedEventArgs>(SenderSendCompleted);
lms.SendAsync(message);
}
Так как ProcessAutosave вызывается из события onunload javascript, которое нельзя отменить, нам нужно, чтобы это было синхронно и не завершено до того, как мы обработаем ответ от каждого подпрограммыокно, чтобы состояние сеанса оставалось действительным и т. д.
В SenderSendCompleted мы удаляем элементы из _windows, когда они сказали, что все сделано.
Поэтому я добавил цикл в конце:
while(_windows.Count > 0) {
Thread.Sleep(1)
}
Однако это никогда не завершается, если я не добавлю на него счетчик итераций.
Являюсь ли я жертвой оптимизации компилятора, то есть изменения в SenderSendCompleted не влияют на цикл while,или я что-то в корне неправильно понял?Или упустил что-то очевидное, которое смотрит мне в лицо?