C# 在非UI线程中从另一个类更新UI

C# 在非UI线程中从另一个类更新UI,c#,ui-thread,begininvoke,C#,Ui Thread,Begininvoke,我想在非UI线程中从另一个类更新UI 但我不能直接在测试类中调用“BeginInvoke” 如何解决它 private void Form1_Load(object sender, EventArgs e) { Task.Run(() => { Test.Set(textBox1); }); } public class Test { public static void Set(TextBox textBox) {

我想在非UI线程中从另一个类更新UI

但我不能直接在测试类中调用“BeginInvoke”

如何解决它

private void Form1_Load(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        Test.Set(textBox1);
    });
}

public class Test
{       
    public static void Set(TextBox textBox)
    {
        // ↓Exception...
        textBox.Text = "ABCD";
    }
}

根据阿列克谢列文科夫的回答

我修改了我的代码,如下所示,它工作得很好

public static void Set(TextBox textBox, string text)
{
        textBox.BeginInvoke(new Action(() => { textBox.Text = text; }));
}

表单应该负责更新自己的UI。它不应该像那样对外公开其私人控制。此外,在使用TPL时,您根本不应该使用
invoke
(至少在典型情况下)。您应该相信这样一个事实:等待任务会安排继续在UI线程上运行,以处理所有UI封送。除了@Servy所说的之外,您能否澄清为什么“不能直接在测试类中调用
BeginInvoke
”(假设您正在谈论)“一个恰当的问题是解决了一半的问题“-发帖前请记住:)他们两人在同一个班级吗?
Test
是嵌套类吗?@chiahien这样做只会让你遇到更多的问题。您不想尝试找出如何从没有业务编辑UI对象的类调用
Invoke