Мне кажется, мне нужны некоторые пояснения относительно использования диспетчера WPF Dispatcher.Invoke и Dispatcher.BeginInvoke.
Предположим, что у меня есть некоторый длинный код работы, такой как тот, который вызывается нажатием кнопки в простом приложении WPF:
longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
Console.WriteLine("Starting Work Action");
int i = int.MaxValue;
while (i > 0)
i--;
Console.WriteLine("Ending Work Action");
longWorkTextBox.Text = "Work Complete";
};
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
Этот код блокирует мой пользовательский интерфейс во время выполнения workAction. Это связано с тем, что вызов Dispatcher всегда запускается в потоке пользовательского интерфейса, правильно?
Предполагая это, , что лучше всего подходит для настройки моего диспетчера для выполнения workAction в отдельном потоке из моего пользовательского интерфейса? Я знаю, что могу добавить BackgroundWorker в свой workAction, чтобы предотвратить блокировку моего пользовательского интерфейса как таковой:
longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate
{
Console.WriteLine("Starting Slow Work");
int i = int.MaxValue;
while (i > 0)
i--;
Console.WriteLine("Ending Work Action");
};
worker.RunWorkerCompleted += delegate
{
longWorkTextBox.Text = "Work Complete";
};
worker.RunWorkerAsync();
};
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
Есть ли еще более элегантные способы сделать это, кроме использования BackgroundWorker? Я всегда слышал, что BackgroundWorker причудливый, поэтому мне интересно узнать некоторые альтернативы.