我的程序中有许多耗时的任务,比如加载大型DataGrids,更新多个数据库等等。我想做的是显示一个"请等待......" MessageBox或Form,同时这些任务正在运行。我已经看过BackgroundWorker,但似乎无法理解它。
为了最大限度地减少所需的代码量,理想情况下我想要一个可以从任何地方调用的方法,因为这将在我的程序中的许多地方使用,尽管我知道这可能很棘手。
public CompanyManagement()
{
InitializeComponent();
FillDataGrid(); // This method takes all the time
}
private void FillDataGrid()
{
//Display a message until this has completed
var _cDS = new CompanyDataService();
var Companies = new ObservableCollection<CompanyModel>();
Companies = _cDS.HandleCompanySelect();
CompanyICollectionView = CollectionViewSource.GetDefaultView(Companies);
CompanyICollectionView.SortDescriptions.Add(new SortDescription("CompanyName", ListSortDirection.Ascending));
DataContext = this;
cancelButton.Visibility = Visibility.Hidden;
if (compNameRad.IsChecked == false &&
compTownRad.IsChecked == false &&
compPcodeRad.IsChecked == false)
{
searchBox.IsEnabled = false;
}
dataGrid.SelectedIndex = 0;
}
有没有办法让一个完全独立的方法来调用?我想这会很难,因为那个方法无法知道任务何时完成,除非它围绕要检查的代码。
编辑:使用Matthew的例子;
public CompanyManagement()
{
InitializeComponent();
var wait = new PleaseWait("My title", "My Message", () => FillDataGrid());
wait.ShowDialog();
}
答案 0 :(得分:2)
如果您使用.Net 4.5或更高版本,可以使用以下方法(这样您就可以使用await
和async
。
1)创建一个名为“PleaseWait”的Window
课程,并添加一个名为Label
的{{1}}。
2)将以下字段和构造函数添加到类中:
label
3)处理窗口的readonly Action _action;
public PleaseWait(string title, string message, Action action)
{
_action = action;
InitializeComponent();
this.Title = title;
this.label.Content = message;
}
事件并命名处理程序loaded
,然后按如下方式实现:
loaded
现在,当您想要显示“请稍候”消息时,创建一个private async void loaded(object sender, RoutedEventArgs e)
{
await Task.Run(() => _action());
this.Close();
}
对象,向其传递标题,消息和封装您要运行的代码的PleaseWait
。例如:
Action
或(使用Lambda):
private void button_Click(object sender, RoutedEventArgs e)
{
var wait = new PleaseWait("My title", "My Message", myLongRunningMethod);
wait.ShowDialog();
}
private void myLongRunningMethod()
{
Thread.Sleep(5000);
}
这只是一个基本概要。还有更多工作要做,包括使“PleaseWait”对话框看起来不错,并禁用用户手动关闭它的功能。