Silverlight и проблемы с асинхронным вызовом - PullRequest
2 голосов
/ 05 марта 2010

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

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

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

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

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

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

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

Что !!!

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

Ответы [ 4 ]

1 голос
/ 05 марта 2010

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

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 голосов
/ 28 января 2014

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

0 голосов
/ 05 марта 2010

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

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

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

0 голосов
/ 05 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...