MongoDB无尽的查找ToListAsync

时间:2015-05-08 19:23:21

标签: c# winforms mongodb asynchronous async-await

我试图从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永远不会被填充。

我做错了什么?

1 个答案:

答案 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);
            }
        }
    }