我在C#类中有一个方法,我试图在一个单独的线程上调用。但是,我需要让这个函数在开始处理之前从用户界面访问多个值,如下所示:
public void validateConnections(bool openExpanderOnError = true) {
//Gather information about the data connection models, and which rows to test
string connectorValue = DBTypes[connector.SelectedValue.ToString()];
EntryRow[] testable = { developer, production, qaTesting, ... , more };
//Run long code
//Churn.....
}
上面代码中的变量是通过获取驻留在同一个类中的值来定义的,如果它是同步执行的,这可以正常工作。
但是,为了运行下面的长代码(我为了简洁而修剪),这些值需要在BEFOREHAND中出现。将所需的所有信息作为参数传递是不切实际的,因为这会很快变得难以驾驭。
如何异步从UI获取这些值?
注意:我尝试使用Dispatcher.Invoke()
代码的这一部分,这导致长代码在设置所需变量之前运行。在长代码运行时使用BackgroundWorker
导致主线程冻结,完全违背了第二个线程的目的。
编辑1:以下是我尝试实施Dispatcher.Invoke()
方法调用的方式:
public void validateConnections(bool openExpanderOnError = true) {
//Gather information about the data connection models, and which rows to test
string connectorValue = "";
EntryRow[] testable = new EntryRow[n];
Dispatcher.Invoke(new Action(() => {
connectorValue = DBTypes[connector.SelectedValue.ToString()];
testable[0] = developer;
testable[1] = production;
//...
testable[n] = qaTesting;
}));
//Run long code
//Churn.....
}
编辑2:我最初拨打的是Dispatcher.BeginInvoke()
,而不是Dispatcher.Invoke()
,它正常工作。
答案 0 :(得分:3)
您的代码看起来是正确的。 Dispatcher.Invoke是同步的,因此长代码不会开始,直到调度方法完成。也许你之前不小心使用过Dispatcher.BeginInvoke?这是具有您描述的行为的异步版本