执行耗时任务时等待消息

时间:2015-12-15 08:48:22

标签: c# wpf

我的程序中有许多耗时的任务,比如加载大型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();
    }

1 个答案:

答案 0 :(得分:2)

如果您使用.Net 4.5或更高版本,可以使用以下方法(这样您就可以使用awaitasync

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”对话框看起来不错,并禁用用户手动关闭它的功能。