c# - C#任务-从UI异步获取值(value)

标签 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.....
}

我在上述代码中拥有的变量是通过获取位于同一类中的值来定义的,并且如果它是同步执行的,则可以很好地工作。

但是,为了运行下面的长代码(为简洁起见,我将其裁剪),这些值必须在使用前出现。将我需要的所有信息作为参数传递是不切实际的,因为这很快就会变得难以控制。

如何从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(),它可以正常工作。

最佳答案

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

关于c# - C#任务-从UI异步获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002729/

相关文章:

c# - 是否可以在 C# 中的项目之间静态共享代码?

java - Asynctask 可以安全地使用大量下载而不是线程吗?

java - 使用 IExecutorService 异步重试

javascript - 在函数内部修改变量后,为什么变量未更改? -异步代码引用

c# - 如何以编程方式打开按钮的鼠标悬停效果?

c# - Linux 上带有单声道的 ServiceStack

c# - 如何打开 Windows 10 ms-settings 特定页面而不访问其他设置

C++ async 仅使用 2 个内核

arrays - 无法从Perl中的子例程插入数组

javascript - sendKeys(index) 中值的 Protractor 循环