我试图从MongoDB集合中检索数据,但是发生了一些奇怪的事情。如果我显示一个MessageBox,那么数据获取是有效的,如果我不是,那就不会。
In [61]:
df.gt(0) & df.lt(1)
Out[61]:
A B C
0 False True False
1 False True False
2 False True False
3 False True False
4 False True False
In [62]:
np.all(df.gt(0) & df.lt(1),axis=0)
Out[62]:
array([False, True, False], dtype=bool)
In [63]:
df.columns[np.all(df.gt(0) & df.lt(1),axis=0)]
Out[63]:
Index(['B'], dtype='object')
上面的代码从数据库中获取内容,下面的代码 - 在我的static class MongoDBController {
static MongoClient client = new MongoClient("mongodb://localhost");
public static async Task<List<Course>> GetCourses(string dbName = "school") {
// Get our course collection
var db = client.GetDatabase(dbName);
var collection = db.GetCollection<Course>("courses");
// Create an empty filter
var filter = new BsonDocument();
// Use the empty filter to get all courses from the database
return await collection.Find(filter).ToListAsync();
}
}
中找到 - 将它放在ListBox中。
Form1.cs
现在如果我删除 Fetching working(yay!)弹出窗口,我的listBox永远不会被填充。
我做错了什么?
答案 0 :(得分:1)
正如Alex所指出的那样,问题的解决方案是使FillCourseList
异步。这允许程序在从数据库中提取数据时继续运行。我之前遇到的拦截电话显然是问题的原因。这确实需要thread-safe calls到Windows窗体。
private delegate void SetListCallback(List<Course> result);
private async Task GetCourseList() {
Task<List<Course>> courseTask = MongoDBController.GetCourses();
List<Course> result = await courseTask.ConfigureAwait(false);
// When finished, fill the listbox
FillCourseList(result);
}
private void FillCourseList(List<Course> result) {
// If the calling thread's ID doesn't match the creating thread's ID
// Invoke this method on the correct thread via the delegate
if (this.listBox_overview_vakken.InvokeRequired) {
SetListCallback d = new SetListCallback(FillCourseList);
this.Invoke(d, result);
} else {
foreach (Course s in result) {
listBox_overview_vakken.Items.Add(s);
}
}
}