我的程序中有许多耗时的任务,如加载大型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;
}有什么方法可以调用完全独立的方法吗?我猜这会很困难,因为那个方法不可能知道什么时候任务已经完成,除非它围绕着要检查的代码。
编辑:使用马修的例子;
public CompanyManagement()
{
InitializeComponent();
var wait = new PleaseWait("My title", "My Message", () => FillDataGrid());
wait.ShowDialog();
}发布于 2015-12-15 11:15:42
如果使用.Net 4.5或更高版本,可以使用以下方法(因此可以使用await和async。
1)创建一个名为“Window”的PleaseWait类,并在其中添加一个名为label的Label。
2)向类中添加以下字段和构造函数:
readonly Action _action;
public PleaseWait(string title, string message, Action action)
{
_action = action;
InitializeComponent();
this.Title = title;
this.label.Content = message;
}3)处理窗口的loaded事件并将处理程序命名为loaded,然后按如下方式实现:
private async void loaded(object sender, RoutedEventArgs e)
{
await Task.Run(() => _action());
this.Close();
}现在,当您想显示“请等待”消息时,创建一个PleaseWait对象,将标题、消息和封装要运行的代码的Action传递给它。例如:
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);
}或者(使用Lambda):
private void button_Click(object sender, RoutedEventArgs e)
{
var wait = new PleaseWait("My title", "My Message", () => Thread.Sleep(5000));
wait.ShowDialog();
}这只是一个基本的大纲。还有更多的工作要做,包括使"PleaseWait“对话框看起来很好看,并禁用用户手动关闭它的能力。
https://stackoverflow.com/questions/34284605
复制相似问题