我有一个带有2个组合框的表单。我想combobox2.DataSource根据combobox1.Text和进行填充combobox2.Text(我假设用户已经完成输入,combobox1并且处于输入的中间combobox2)。所以我有一个这样的事件处理程序combobox2:
combobox2.DataSource
combobox1.Text
combobox2.Text
combobox1
combobox2
private void combobox2_TextChanged(object sender, EventArgs e) { if (cmbDataSourceExtractor.IsBusy) cmbDataSourceExtractor.CancelAsync(); var filledComboboxValues = new FilledComboboxValues{ V1 = combobox1.Text, V2 = combobox2.Text}; cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues ); }
至于构建DataSource是耗时的过程(它创建对数据库的请求并执行它),我认为最好使用BackgroundWorker在另一个过程中执行它。因此,有一种情况是cmbDataSourceExtractor尚未完成其工作,而用户又键入了一个符号。在这种情况下,我在此行上看到一个异常,原因 cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues );是BackgroundWorker很忙,无法同时执行多个操作。 如何摆脱这种例外? 提前致谢!
cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues );
CancelAsync实际上并没有终止您的线程或类似的东西。它向工作线程发送一条消息,指出应通过取消工作BackgroundWorker.CancellationPending。在后台运行的DoWork委托必须定期检查此属性并自行处理取消。
CancelAsync
BackgroundWorker.CancellationPending
棘手的部分是您的DoWork委托可能正在阻塞,这意味着您必须先完成对DataSource的工作,然后才能执行其他任何操作(例如检查CancellationPending)。您可能需要将实际工作移到另一个异步委托(或者可能更好的方法是,将工作提交到ThreadPool),并进行主工作线程轮询,直到该内部工作线程触发等待状态,或者它检测到CancellationPending。
ThreadPool
http://msdn.microsoft.com/zh- CN/library/system.componentmodel.backgroundworker.cancelasync.aspx
http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx