【问题标题】:Progress window when doing computation in the UI thread在 UI 线程中进行计算时的进度窗口
【发布时间】:2012-07-16 12:22:57
【问题描述】:

我想实现这个:

  1. 创建一个新窗口,它只是一个旋转加载器和一些静态文本,并显示它。
  2. 在 UI 线程上进行一些计算(必须在那里完成)
  3. 关闭加载程序窗口

目前,当我在加载程序窗口上调用 .Show() 时,它根本不加载,它只是作为一个空白窗口挂起(UI 线程被阻塞,我不想要)

我可以做些什么来使加载器窗口在我的计算完成的同时显示其内容?

private void CopyToClipboard(object sender, RoutedEventArgs e)
    {
        var selected = mDataGrid.SelectedItem;
        var selectedIndex = mDataGrid.SelectedIndex;
        var progressWindow = mProgressDialog.Create(this,"Copying data to clipboard");
        progressWindow.Show();
        try
        {

            mDataGrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
            mDataGrid.SelectionMode = DataGridSelectionMode.Extended;
            mDataGrid.SelectAllCells();  // SLOW !!!!
            ApplicationCommands.Copy.Execute(null, mDataGrid); //SLOW !!!!
        }
        catch (Exception ex)
        {
            mLog.Error("Copying to clipboard", ex);
            MessageBox.Show("Error while copying to clipboard");
        }
        finally
        {
            mDataGrid.SelectionMode = DataGridSelectionMode.Single;
            mDataGrid.UnselectAllCells();
            this.Select(selectedIndex, selected);
            progressWindow.Close();
        }
    }

【问题讨论】:

  • 只是想知道为什么你的计算必须在 UI 线程上完成?
  • 也许他的计算操作了一些数据绑定到 UI 元素的对象,如果它们在另一个线程上“改变”,一切都会崩溃。
  • 您实际上可以在代码中看到,它正在选择数据网格的所有单元格并将它们复制到剪贴板 = 操作 UI 控件

标签: c# wpf multithreading ui-thread


【解决方案1】:

正如你所说,你的计算是在 UI 线程上完成的,这就是为什么你的窗口是空白的,由于 UI 线程很忙,它没有“重新绘制”。

因此,除非您在另一个线程上进行长时间运行的计算,否则您将陷入困境。

【讨论】:

  • 我知道线程很忙,难道没有例如在全新的 UI 线程上执行“加载器窗口”的方法吗?正如您在代码中看到的,计算操作数据网格,因此它必须在 UI 线程中。 (或者我可以例如将整个数据网格复制到一个新的 UI 线程/进程/...并在那里执行它吗?)
【解决方案2】:

我唯一能做到的是:

progressWindow.Show();
this.DoEvents();


public static void DoEvents(this Window _)
    {
        Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
                                              new Action(delegate { }));
    }

“加载器窗口”至少会显示出来,因此用户知道正在发生一些事情。它通常持续不到一秒钟,所以这个解决方案对我来说是可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多