【问题标题】:ProgressBar during ToList when retrieving MongoDB documents检索 MongoDB 文档时 ToList 期间的 ProgressBar
【发布时间】:2019-08-21 21:11:01
【问题描述】:

我有数以千计的文档将被检索、稍微调整并显示在数据网格中。整个情况可能需要 10-30 秒,并且需要视觉显示进度(比选取框进度条更实质性的东西)

我们的目标是使用当前通过ToList()(或者应该是ToListAsync())获取的文档数来更新状态字段。假设进度更新率是每 250 毫秒回调一次显示当前文档数(或列表长度?)。我不确定如何指示任务执行有助于进度/状态更新程序的回调,或者如何设置 ToList 进行进度调用。

private async void CollectionDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
        string collectionName = collectionDDL.SelectedItem.ToString();

        // progressBar/status begin stuff
        await LoadCollection(collectionName);
        // progressBar/status finish stuff

        … set the datagrid datasource to the datatable
}

private Task LoadCollection(string collectionName) 
{
    return Task.Run(() =>
    {
        var builder = Builders<BsonDocument>.Filter;
        var filter = builder.Ne("Type", "Header") & builder.Ne("Type", (string)null);

        var collectionDocuments =
            Database
            .GetCollection<BsonDocument>(collectionName)
            .Find(filter)
            .ToList()                    
        ;
        … 
        // reshape documents into a DataTable
    }
}

【问题讨论】:

    标签: winforms async-await mongodb-query progress-bar


    【解决方案1】:

    您可以使用progress

    private async void CollectionDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
            // ...
    
            var progress = new Progress<int>(n => /* show progress */);
    
            await LoadCollection(collectionName, progress);
    
            // ...
    }
    
    private Task LoadCollection(string collectionName, IProgress<int> progress) 
    {
        return Task.Run(() =>
        {
            // ...
    
            progress.Report(i);
    
            // ...
        }
    }
    

    我不知道 MongoDB 是否有异步 API。如果是这样,您甚至可能会摆脱 Task.Run

    【讨论】:

    • 有一个ToListAsync()。你能想出一种从ToList内部 调用Report 的方法吗?
    • 仅当 ToListAsync 作为 IProgress 参数时。这是一个 HTTP 请求,它是 1 个请求和 1 个响应。解析响应时,您只知道它是多个项目。您始终可以为 HTTP 部分设置一个选框,并为您的处理设置一个计数(这可能会使整个事情变慢)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2012-12-07
    • 2015-05-25
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多