C#任务 - 从UI异步获取值

时间:2014-06-02 20:29:36

标签: c# multithreading asynchronous task

我在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(),它正常工作。

1 个答案:

答案 0 :(得分:3)

您的代码看起来是正确的。 Dispatcher.Invoke是同步的,因此长代码不会开始,直到调度方法完成。也许你之前不小心使用过Dispatcher.BeginInvoke?这是具有您描述的行为的异步版本