Асинхронный опрос используется для потока GUI - PullRequest
0 голосов
/ 16 мая 2010

Я прочитал, что могу использовать асинхронный вызов с опросом, особенно когда поток вызывающего абонента обслуживает GUI. Я не вижу, как, потому что:

while(AsyncResult_.IsCompleted==false) //this stops the GUI thread
{
}

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

Ответы [ 3 ]

1 голос
/ 16 мая 2010

Вы правы в своем цикле while, останавливая поток GUI, когда делаете это таким образом, вы не хотите этого делать.

Если вам нужно провести опрос, лучше установить таймер и проверить, завершена ли работа при срабатывании таймера. Таймер может иметь небольшое разрешение без проблем (например, 100 мс), если вы не выполняете много работы во время каждого такта.

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

0 голосов
/ 24 июля 2015

У меня была такая же проблема со старым API, выставляющим BeginExecute() и EndExecute(). BeginExecute() начал асинхронную операцию, а затем замолчал, пока не завершил выполнение до конца. Но мне нужно было обновить промежуточное состояние хода выполнения в режиме реального времени. Поэтому я пришел к следующему решению:

var asyncResult = command.BeginExecute();
while (!asyncResult.IsCompleted)
{
    if (command.State != OldState)
    {
        progress.Report(newState);
    }

    // Key piece in this polling loop.
    await Dispatcher.Yield(DispatcherPriority.ApplicationIdle);
}
command.EndExecute(asyncResult);

Сначала я использовал

await Task.Yield();

Но потом я обнаружил, что в WPF он не возвращает управление в GUI, поскольку этот цикл будет иметь более высокий приоритет. Вот почему я перешел на эту инструкцию:

await Dispatcher.Yield(DispatcherPriority.ApplicationIdle);

Так что теперь GUI будет проверять и обновлять прогресс только тогда, когда ему больше нечего делать:)

0 голосов
/ 16 мая 2010

Смысл асинхронного опроса заключается в том, что между проверками IsCompleted вы можете делать другие вещи, такие как обслуживание событий графического интерфейса. Вы можете установить таймер, например, чтобы запускать событие несколько раз в секунду, чтобы проверить, завершена ли ваша асинхронная операция, и использовать обычный цикл событий GUI для обслуживания этих событий вместе со всеми другими событиями, которые получает ваш GUI. Таким образом, ваш графический интерфейс остается отзывчивым, и вскоре после завершения асинхронной операции ваш обработчик событий таймера заметит это.

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