Backgroundworker适用于WPF吗?

13 浏览
0 Comments

Backgroundworker适用于WPF吗?

以前我在一些旧的Windows Forms应用程序中使用BackgroundWorker。现在在尝试WPF/XAML时,在工具箱中找不到它。基本上,我想在不阻塞GUI线程的情况下执行一些大型数据库查询。在WPF中,什么是首选的方法?

0
0 Comments

BackgroundWorker for WPF的出现原因是为了在WPF应用程序中实现后台线程操作,以便在长时间运行的过程中更新UI对象。虽然在WPF中可以使用TPL调用、BackgroundWorker或普通的异步方法来实现后台操作,但关键在于任何对UI对象的更新都需要在正确的线程上调用,这可以通过Dispatcher.Invoke()方法来实现。

对于在不同线程上更新UI对象的一般意见是尽量避免,因为这样做感觉不太合适。然而,在某些情况下,如果你要在长时间运行的过程中报告进度,如果想要向用户提供有意义的通知,除了使用一个不确定的ProgressBar/BusyIndicator之外,就别无选择,必须从特定的线程更新UI。

解决这个问题的方法是使用BackgroundWorker类来处理后台操作,并使用Dispatcher.Invoke()方法在正确的线程上更新UI对象。这样可以确保在长时间运行的过程中及时更新UI,向用户提供有意义的通知。

以下是一个使用BackgroundWorker的示例代码:

private void StartBackgroundWorker()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += Worker_DoWork;
    worker.ProgressChanged += Worker_ProgressChanged;
    worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
    worker.RunWorkerAsync();
}
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    // 长时间运行的操作
    // 更新进度
    (sender as BackgroundWorker).ReportProgress(progress);
}
private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // 在UI线程上更新UI对象
    Dispatcher.Invoke(() =>
    {
        // 更新UI对象
    });
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // 长时间运行的操作完成后的处理
}

通过使用BackgroundWorker类和Dispatcher.Invoke()方法,可以在WPF应用程序中实现后台线程操作,并确保及时更新UI对象,提供有意义的通知给用户。

0
0 Comments

BackgroundWorker是在.NET中使用的一个组件,在WPF中也可以使用。

ADO支持异步回调。

代码示例:

AsyncCallback callback = new AsyncCallback(HandleCallback);
// 调用BeginExecuteNonQuery方法后,代码会继续执行,用户可以与窗体进行交互,而服务器会执行查询操作。
command.BeginExecuteNonQuery(callback, command);

可以通过使用异步回调的方式来在WPF中使用BackgroundWorker组件来执行后台操作。

0