【发布时间】:2012-07-16 12:22:57
【问题描述】:
我想实现这个:
- 创建一个新窗口,它只是一个旋转加载器和一些静态文本,并显示它。
- 在 UI 线程上进行一些计算(必须在那里完成)
- 关闭加载程序窗口
目前,当我在加载程序窗口上调用 .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