簡體   English   中英

BackgroundWorker停止刷新WPF UI

[英]BackgroundWorker stops the WPF UI to be refreshed

前段時間,我編寫了一個簡單的應用程序,該應用程序使用了使用BackgroundWorker的基於WPF的UI:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.RunWorkerAsync();
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        LoadTextBlock.Visibility = Visibility.Hidden;
        if (e.Error == null)
        {
            foreach (TechNews news in (e.Result as List<TechNews>))
            {
                NewsListBox.Items.Add(news);
            }
        }
        else
        {
            MessageBox.Show(e.Error.Message, "Error");
        }
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        CNetTechNewsParser parser = new CNetTechNewsParser();
        parser.Parse();
        e.Result = parser.News;
    }
}

那時,它工作得很好。 但是現在我再次啟動它,發現UI停止刷新,即LoadTextBlock不會消失,新聞也不會顯示在列表框中。 只有在我最小化應用程序后,它才會刷新。

我從DoWork中刪除了所有解析功能,但效果相同。 然后注釋RunWorkerAsync,UI開始正常工作。 因此,我建議問題是由BackgroundWorker引起的。 但是我不明白這是怎么回事?

謝謝

我很困惑,沒有拋出無效的跨線程錯誤(UnauthorizedAccessException),但是盡管如此,您仍然可以使用擴展方法在目標控件的正確分派器上調用UI Update邏輯。

public static class WindowExtensions
{
        public static void Dispatch(this Control control, Action action)
        {
            if (control.Dispatcher.CheckAccess())
                action();
            else
                control.Dispatcher.BeginInvoke(action);
        }
}

在您的情況下,用法如下:

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    this.Dispatch(() =>
    {
        LoadTextBlock.Visibility = Visibility.Hidden;
        if (e.Error == null)
        {
            foreach (TechNews news in (e.Result as List<TechNews>))
            {
                NewsListBox.Items.Add(news);
            }
        }
        else
        {
            MessageBox.Show(e.Error.Message, "Error");
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM