Giải pháp cho vấn đề, như Alex vui lòng chỉ ra, là tạo ra FillCourseList
asynchronous aswell. Điều này cho phép chương trình tiếp tục chạy trong khi dữ liệu được tìm nạp từ cơ sở dữ liệu. Cuộc gọi chặn mà tôi đã gặp trước đây rõ ràng là nguyên nhân của sự cố. Điều này làm tăng thêm nhu cầu về thread-safe cuộc gọi
sang Biểu mẫu 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);
}
}
}