Как подождать, пока пользовательский контроль будет полностью загружен в WPF [duplicate]

Отсортировано поле rev в обратном порядке, а затем сгруппировано по идентификатору, который дал первую строку каждой группы, которая является самой высокой величиной rev.

SELECT * FROM (SELECT * FROM table1 ORDER BY id, rev DESC) X GROUP BY X.id;

Проверено в http: //sqlfiddle.com/ со следующими данными

CREATE TABLE table1
    (`id` int, `rev` int, `content` varchar(11));

INSERT INTO table1
    (`id`, `rev`, `content`)
VALUES
    (1, 1, 'One-One'),
    (1, 2, 'One-Two'),
    (2, 1, 'Two-One'),
    (2, 2, 'Two-Two'),
    (3, 2, 'Three-Two'),
    (3, 1, 'Three-One'),
    (3, 3, 'Three-Three')
;

Это дало следующий результат в MySql 5.5 и 5.6

id  rev content
1   2   One-Two
2   2   Two-Two
3   3   Three-Two

10
задан username 11 July 2011 в 17:58
поделиться

3 ответа

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

Один действительно отличный подход - использовать yield return и позволить компилятору позаботиться о все логики замыканий:

IEnumerable AsyncLoadUI()
{
    var p = new Panel();
    Controls.Add(p);
    yield return null;

    for( int i = 0; i < 50; ++i ) {
        var txt = new TextBox();
        p.Controls.Add(txt);
        yield return null;
    }
}

override void OnLoad(EventArgs e)
{
    IEnumerator tasks = AsyncLoadUI().GetEnumerator();
    MethodInvoker msg = null;
    msg = delegate { if (tasks.MoveNext()) BeginInvoke(msg); };
    msg();
}
6
ответ дан Ben Voigt 26 August 2018 в 23:41
поделиться

Взгляните на мое решение, предлагаемое другому . У них была очень похожая проблема. Подождите, пока все закончит свою загрузку, прежде чем делать какое-то действие, но не каждый раз, когда форма обязательно становится «активирована» или «показана». Это связано с привязкой к Load loader вашего внешнего контроля интереса. В вашем случае, с вкладкой страницы, но пример решения я представил был на уровне FORM.

2
ответ дан Community 26 August 2018 в 23:41
поделиться

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

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

Если вы предпочитаете загружать свой список асинхронно (в фоновом потоке), тогда идея чтобы начать фоновый поток (обычно с помощью BackgroundWorker ), который выполняет тяжелую работу по подготовке списка добавляемых элементов - когда это закончится (или не удалось), поле формы / списка обновляется с помощью предоставленный список элементов.

Вы должны быть в состоянии найти множество ресурсов о том, как это сделать в Интернете, которые будут охватывать это более подробно.

1
ответ дан Justin 26 August 2018 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: