В WPF, что эквивалентно Suspend / ResumeLayout () и BackgroundWorker () из Windows Forms

/(.*)<FooBar>/s

s вызывает Dot (.) для соответствия возврату каретки

13
задан g t 13 April 2016 в 22:22
поделиться

3 ответа

В чтении статьи Shawn Wildermuth Потоки WPF: Создайте Больше Быстро реагирующих Приложений С Диспетчером .

я приехал через следующее, которое указывает, что можно использовать Второстепенного Рабочего точно так же, как Вы могли в WindowsForms. Предположите что:

BackgroundWorker Теперь, когда у Вас есть смысл того, как Диспетчер работает, Вы могли бы быть удивлены знать, что Вы не найдете использование для него в большинстве случаев. В Windows Forms 2.0 Microsoft представила класс для обработки потока неUI для упрощения модели разработки для разработчиков пользовательского интерфейса. Этот класс называют BackgroundWorker. Рисунок 7 показывает типичное использование класса BackgroundWorker.

рисунок 7 Используя BackgroundWorker в WPF

BackgroundWorker _backgroundWorker = new BackgroundWorker();

...

// Set up the Background Worker Events
_backgroundWorker.DoWork += _backgroundWorker_DoWork;
backgroundWorker.RunWorkerCompleted += 
    _backgroundWorker_RunWorkerCompleted;

// Run the Background Worker
_backgroundWorker.RunWorkerAsync(5000);

...

// Worker Method
void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Do something
}

// Completed Method
void _backgroundWorker_RunWorkerCompleted(
    object sender, 
    RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        statusText.Text = "Cancelled";
    }
    else if (e.Error != null) 
    {
        statusText.Text = "Exception Thrown";
    }
    else 
    {
        statusText.Text = "Completed";
    }
}

компонент BackgroundWorker работает хорошо с WPF, потому что под покрытиями он использует класс AsyncOperationManager, который в свою очередь использует класс SynchronizationContext для контакта с синхронизацией. В Windows Forms, AsyncOperationManager руки прочь от класса WindowsFormsSynchronizationContext, который происходит из класса SynchronizationContext. Аналогично, в ASP.NET это работает с другой деривацией SynchronizationContext по имени AspNetSynchronizationContext. Эти SynchronizationContext-производные-классы знают, как обработать синхронизацию перекрестного потока вызова метода.

В WPF, эта модель расширяется с помощью класса DispatcherSynchronizationContext. При помощи BackgroundWorker Диспетчер нанимается автоматически для вызова вызовов метода перекрестного потока. Хорошие новости - то, что, так как Вы, вероятно, уже знакомы с этим общим шаблоном, можно продолжить использовать BackgroundWorker в новых проектах WPF.

1
ответ дан adrianbanks 13 April 2016 в 22:22
поделиться

Самый легкий способ заставить это работать состоит в том, чтобы добавить LoadSettingsGridData к очереди диспетчера. При установке DispatcherPriority операции достаточно достаточно низко операции расположения произойдут, и Вы будете хороши для движения.

StatusBarMessageText.Text = "Loading Configuration Settings...";
this.Dispatcher.BeginInvoke(new Action(LoadSettingsGridData), DispatcherPriority.Render);
this.Dispatcher.BeginInvoke(new Action(() => StatusBarMessageText.Text = "Done"), DispatcherPriority.Render);
-1
ответ дан Abe Heidebrecht 13 April 2016 в 22:22
поделиться

Самый лучший и простой:

using(var d = Dispatcher.DisableProcessing())
{
    /* your work... Use dispacher.begininvoke... */
}

Или

IDisposable d;

try
{
    d = Dispatcher.DisableProcessing();
    /* your work... Use dispacher.begininvoke... */
} finally {
    d.Dispose();
}
33
ответ дан 1 December 2019 в 19:51
поделиться
Другие вопросы по тегам:

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