2010-03-05 3 views
2

У меня есть некоторый код, который работает следующим образом:Silverlight и проблемы с асинхронным вызовом

App.xaml вызывает метод SetUp(), который заполнит локальную коллекцию с помощью асинхронных вызовов и выставляет коллекцию в качестве публичной собственности.

Это все хорошо.

Теперь я сделать экземпляр первой страницы в моем Silverlight приложения как так

private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     this.RootVisual = new Summary(); 
    } 

В конструкторе Резюме() Я ожидаю, что те асинхронной вызовы были полными и моя коллекция для заполнения, но асинхронные вызовы еще не завершены. Даже если я делаю Thread.Sleep (100000 ....), прежде чем я сделаю экземпляр на Summary(), это так.

И дело в том, что до выхода конструктора Summary() и отображения пользовательского интерфейса для пользователя мои асинхронные вызовы не срабатывают!

Что !!!

Есть ли что-нибудь, что я могу сделать по этому поводу, или это только то, как работают асинские вызовы, т. Е. Они ждут, пока ток не закончится до начала работы?

ответ

0

Silverlight был специально разработан, чтобы не иметь каких-либо блокирующих операций - вот почему вы должны сначала выполнить асинхронную работу. То, что вам действительно нужно сделать, - заставить приложение работать должным образом, ожидая выполнения обработчика завершения асинхронизации.

0

Это по дизайну. Альтернативой было бы то, что пользователь должен ждать дольше, прежде чем он что-нибудь увидит.

Если вы действительно хотите предотвратить показ неполного лета, сначала показывайте другую страницу с «ожиданием» или индикатором выполнения. Огоньте асинхронные события с этой страницы или ее родителя. Затем отобразите Сводку, когда возвращается асинхронный вызов.

Чтобы справиться с неполным Резюме Вы можете использовать ICommand

1

Это, как я работаю вокруг этой ситуации (я буду использовать простую строку загрузки в качестве примера): -

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    WebClient web = new WebClient(); 
    web.DownloadStringCompleted += (s, args) => 
    { 
     // Do stuff with args.Result); 
     this.RootVisual = new Summary(); 
    }; 
    web.DownloadStringAsync(new Uri("SomeUrl.txt", UriKind.Relative)); 
} 

Примечание что конструкция Summary и назначение RootVisual отложены до завершения асинхронной загрузки.

0

Я знаю, что это старая тема, но для всех последующих читателей я хочу предоставить свой опыт с аналогичной проблемой. Если я понял вас правильно - причина, по которой ваши асинхронные вызовы не выполняются, заключается в том, что вы блокируете основной поток. Я столкнулся с той же проблемой, если вы заблокируете основной поток, ни один из других потоков не будет продолжен. Решение заключалось в том, чтобы делать асинхронные вызовы внутри фонового рабочего и показывать, как сказал pauldendulk, страницу ожидания. Используйте Debug.WriteLine() для контроля процесса на выходе.