我有成千上万的文档将被检索,位抖动并显示在数据网格中。 整个情况可能需要 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
}
}
您可以使用进度:
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
。