【问题标题】:How to work on multiple windows in WPF如何在 WPF 中的多个窗口上工作
【发布时间】:2015-07-09 04:04:19
【问题描述】:

我有一个 C# WPF 应用程序,它进行一些数据处理。由于应用程序需要一些时间来进行处理,有时窗口会冻结。所以我基本上是想找到一种方法,这样用户就不会吓坏了。我正在考虑在处理一些统计数据时产生第二个窗口,而主窗口保持在后台或隐藏,直到处理完成为止效果更好。也许这可以防止事情冻结或至少隐藏它?

目前,我尝试使用以下代码在处理开始时创建第二个窗口...但我不确定如何为其编辑 XAML。我正在使用 VS 2013 并且只看到我的初始窗口的 XAML。任何帮助将不胜感激!

    Window win = new Window();
    win.Show();
    win.Activate();

【问题讨论】:

  • 为简单起见,如果您的应用程序除了数据处理之外什么都不做,您没有理由使用多个线程。正如您所提到的,您可以在计算开始时显示一些信息弹出对话框,例如“正在计算...”,并隐藏窗口,例如发生 OnFinished 事件时。
  • 在设计良好的应用程序中应该只有一个窗口。

标签: c# wpf xaml


【解决方案1】:

我上次在 WPF 工作时,我认为它不能很好地处理多个窗口。即便如此,它也不能解决你的问题。您的问题是您的长时间运行的任务与您的 UI 在同一线程上运行。

您的问题的真正解决方案是异步编码。有关背景信息,请查看 .net TPL 以及 async/await 功能。这些分别在 .net 4.0 和 4.5 中可用。

这是一个如何使用它的示例。

private async void BeginProcessingAsync(Data d)
{
    //Show to user that task is running
    this.IsLoading = true; // Show a loading icon or something.

    //Execute the long running task asynchronously
    await Task.Run(() =>  LongRunningMethod(d));

    //Anything after the await line will be executed only after the task is finished.
    this.IsLoading = false;
    DoSomethingWithFinishedData(d);
}

【讨论】:

  • 谢谢,这对我很有帮助。此外,对于使用此解决方案的任何人.. 如果您的项目以 .NET 4.0 为目标,请使用 Task.Factory.StartNew() 而不是 Task.Run()
【解决方案2】:

您应该在不同的线程或后台运行长时间运行的处理。

一个简单的方法是使用BackgroundWorker

var bw = new BackgroundWorker();
bw.DoWork += (s, e) =>
    {
        //put the long running process in here.
    };

bw.RunWorkerAsync();

【讨论】:

  • bw.DoWork += (s,e) => 那部分是什么意思?
  • 正在创建一个匿名事件处理程序。 s 是事件的sendere 是提供给DoWork 的事件的EventArgs。您不需要使用其中任何一个。
  • 我在按钮单击事件中复制了您的代码,并调用了一个在其中运行很长时间的函数,但什么也没发生。它只是跳过了整个 sn-p。经过的时间:0.00 秒
  • 它异步运行,所以它“看起来”好像什么都没有发生。在DoWork 处理程序中放置一个断点,您会看到它正在运行。
  • 啊,我明白了,那我如何检测进程何时完成运行?
【解决方案3】:

您遇到的问题是 UI 线程试图完成所有工作。虽然 UI 线程正在处理一个长期进程,但它无法更新您的窗口。

您要做的是让一个单独的线程处理后台进程。这在用户想要关闭窗口或取消当前进程之前效果很好。那时您必须开始担心 UI 线程和工作线程之间的交互。为此,.Net 为我们提供了一种称为取消令牌的东西,这将允许我们(如果我们愿意)手动跟踪何时取消进程。

取消令牌很容易与Task class 一起使用。您可以使用 await/async 对此进行补充,这样您就不必手动检查以等待任务完成。

您的选项将根据您当前的框架而有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多