【问题标题】:Background work with UI使用 UI 进行后台工作
【发布时间】:2011-07-27 10:23:35
【问题描述】:

在 WPF 中使用 UI 进行后台工作是否更容易?

WinForms 太痛苦了,想要更简单的方法。我想做数据库工作,当它做数据库工作时,我想用从数据库返回的结果填充一个控件,当它发生时和完成后。

【问题讨论】:

  • 多年来我们一直在WinForms中成功使用BackgroundWorker,并没有发现它是一种“痛苦”。如果您遇到问题,请在问题中发布您的代码,我们可以看看。

标签: c# .net wpf winforms multithreading


【解决方案1】:

这是一个代码示例:

private void RunButton_Click(object sender, RoutedEventArgs e)
{
    ThreadPool.QueueUserWorkItem(
        delegate
        {
            // Do work

            Dispatcher.Invoke(new Action(
               delegate 
               { 
                   // Do UI stuff
               }));

            // Do more work

            Dispatcher.Invoke(new Action(
               delegate 
               { 
                   // Do UI stuff
               }));
        });
}

但是请注意,如果在后台线程中抛出异常,应用程序将终止。您应该在后台线程上捕获异常,然后在 UI 线程上重新抛出它们(再次使用 Dispatcher)。

【讨论】:

    【解决方案2】:

    与 WPF 中的 WinForms 一样,需要在 UI 线程上对 UI 控件进行更改。然而,通过数据绑定的方式,它可以变得更容易管理。例如,如果您将 UI 绑定到某些属性,那么您可以从其他线程更改这些属性,并且绑定将接管其余部分。对于集合,它变得有点棘手,但是那里有线程安全的可观察集合实现,并且在 .Net 4 中有一些包含在框架中。 BackgroundWorker 类也可能对您感兴趣。

    【讨论】:

    • 谢谢!在 WinForms 中的 backgroundworker 课程把我吓坏了!我以为我已经准备好了!但不,我不是。它只是从未更新过用户界面。
    • 使用BackgroundWorker有什么问题??
    • 说实话,我从来没有使用过后台工人阶级。我总是通过使用BeginInvoke 或显式排队或使用带有工作项队列的持续运行的线程来触发对线程池的异步操作。
    • 嗯,BeginInvoke 和不断运行的带有工作项队列的线程看起来很有趣。我会调查他们,我以前从未听说过他们。
    • @ferosekhanj - 我一直遇到的问题是,我在 MSDN 文档中读到您需要在 ProgressChanged 中进行 UI 工作,但即使我这样做了,视觉上也没有发生任何事情UI,并且值甚至没有被分配给 progresschanged 事件中的字符串。大约一个月后,我就放弃了。不得不继续前进并找到解决方法。
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多