首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行耗时的任务时等待消息

在执行耗时的任务时等待消息
EN

Stack Overflow用户
提问于 2015-12-15 08:48:22
回答 1查看 329关注 0票数 1

我的程序中有许多耗时的任务,如加载大型DataGrids、更新多个数据库等。我想要做的是显示一个“请等待.”当这些任务运行时,MessageBox或Form。我已经看过BackgroundWorker了,但我似乎无法理解它。

为了减少所需代码的数量,理想情况下,我想要一个可以从任何地方调用的方法,因为这将在我的程序中的许多地方使用,尽管我知道这可能很棘手。

代码语言:javascript
复制
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;
}

有什么方法可以调用完全独立的方法吗?我猜这会很困难,因为那个方法不可能知道什么时候任务已经完成,除非它围绕着要检查的代码。

编辑:使用马修的例子;

代码语言:javascript
复制
    public CompanyManagement()
    {
        InitializeComponent();
        var wait = new PleaseWait("My title", "My Message", () => FillDataGrid());
        wait.ShowDialog();
    }
EN

回答 1

Stack Overflow用户

发布于 2015-12-15 11:15:42

如果使用.Net 4.5或更高版本,可以使用以下方法(因此可以使用awaitasync

1)创建一个名为“Window”的PleaseWait类,并在其中添加一个名为labelLabel

2)向类中添加以下字段和构造函数:

代码语言:javascript
复制
readonly Action _action;

public PleaseWait(string title, string message, Action action)
{
    _action = action;
    InitializeComponent();
    this.Title = title;
    this.label.Content = message;
}

3)处理窗口的loaded事件并将处理程序命名为loaded,然后按如下方式实现:

代码语言:javascript
复制
private async void loaded(object sender, RoutedEventArgs e)
{
    await Task.Run(() => _action());
    this.Close();
}

现在,当您想显示“请等待”消息时,创建一个PleaseWait对象,将标题、消息和封装要运行的代码的Action传递给它。例如:

代码语言:javascript
复制
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):

代码语言:javascript
复制
private void button_Click(object sender, RoutedEventArgs e)
{
    var wait = new PleaseWait("My title", "My Message", () => Thread.Sleep(5000));
    wait.ShowDialog();
}

这只是一个基本的大纲。还有更多的工作要做,包括使"PleaseWait“对话框看起来很好看,并禁用用户手动关闭它的能力。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34284605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档