WPF Dispatcher.BeginInvoke和UI/Background Threads

我想我需要一些关于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调用总是在UI线程上运行,对吧?

假设这样做,配置我的调度程序在我的UI中的单独线程中执行workAction的最佳做法是什么?我知道我可以添加一个BackgroundWorker到我的workAction,以防止我的UI锁定:

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是古怪的,所以我很好奇地知道一些选择。

我真的认为BackgroundWorker是最优雅的解决方案。我不能想到一个更简单的方法来做到这一点。
翻译自:https://stackoverflow.com/questions/1207832/wpf-dispatcher-begininvoke-and-ui-background-threads

转载注明原文:WPF Dispatcher.BeginInvoke和UI/Background Threads