c# - 如何访问 UI 线程上的值?

标签 c# multithreading

通过 BeginInvoke 调用 UI 控件上的操作没有问题,但是,这是一个 void 方法。我需要从文本框中获取一个值以用于不同的线程。

我怎样才能做到这一点?

最佳答案

最简单的解决方案是在闭包中捕获局部变量。

String text;
textBox.Invoke(() => text = textBox.Text);

编译器将生成一些与 chibacity 的解决方案非常相似的代码 - 局部变量成为编译器生成的类的一个字段。

更新

这不起作用 - lambda 表达式不可分配给 Delegate。这个问题可以使用扩展方法来解决。

internal void ExecuteOnOwningThread(this Control control, Action action)
{
    if (control.InvokeRequired)
    {
        control.Invoke(action);
    }
    else
    {
        action();
    }
}

用法如下。

String text;
textBox.ExecuteOnOwningThread(() => text = textBox.Text);

可以将多个语句填充到 lambda 表达式中。

textBox.ExecuteOnOwningThread(() =>
{
    DoStuff();
    text = textBox.Text
    DoOtherStuff();
});

但是正如 chibacity 已经在评论中提到的那样,显式编写一个方法可能会更好。超过某个点使用 lambda 表达式会对代码的可读性产生不利影响。而且使用lambda表达式当然很容易引入重复代码。

关于c# - 如何访问 UI 线程上的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937032/

相关文章:

c# - System.Diagnostics.Process.Start 问题 "Can not find specific file"

c# - 如何以及何时从 awaitable(async) 方法获取返回值

c++ - 我想让线程的执行顺序依次执行

c++ - 使用 vector 作为多线程队列是否安全?

c++ - 在线程 A 中创建对象,在线程 B 中使用。需要互斥锁吗?

c# - 在 C# 中保存固定数量数据的最佳类

c# - Windows 窗体中的图形

c# - 查看 Excel 是否处于 .NET 中的单元格编辑模式的解决方法

python - python 2.7中的线程延迟

Java 基本同步线程