【问题标题】:Update UI from another class in non-UI thread从非 UI 线程中的另一个类更新 UI
【发布时间】:2018-03-15 15:39:16
【问题描述】:

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

但是我不能直接在Test类中调用“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";
    }
}

【问题讨论】:

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

标签: c# ui-thread begininvoke


【解决方案1】:

根据 AlexeiLevenkov 的回复。

我修改了我的代码,如下所示,它运行良好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多