代码之家  ›  专栏  ›  技术社区  ›  koviroli

从bakcground线程调用UI线程上的许多方法

  •  1
  • koviroli  · 技术社区  · 7 年前

    我有一个Windows窗体应用程序,它有一个并行计算很长时间的多线程。在计算这些线程时,修改UI元素(如标签、文本框、按钮等)并写入RichTextBox。

    我有很多这样的方法:

    private void AppendText(string text)
    {
        if(richTextBox.InvokeRequired)
        {
            Invoke(myDelegate, new object[] { text });
        }
        else
        {
            richTextBox.Append(text);
        }
    }
    

    我的问题是:

    这是从后台线程修改UI线程控件的好方法,还是我犯了一些架构错误?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mrinal Kamboj    7 年前

    下面是一个简单的代码来解释 Async-Await

    public async Task Main()
    {
        var result = await Background("Test");
        // Update Ui here, its on Ui thread
    }
    
    // Executed Asynchronously in the Background
    public async Task<string> Background(string text)
    {
        return await Task.FromResult(text);
    }
    
    • Background
    • 背景 方法,结果可以在控件上更新,其自动Ui线程
    • Task Parallel Library 显式地处理数据,然后更新结果
    • await 仍然是一个阻塞调用,虽然它将释放调用上下文,这意味着Ui不会冻结,它仍然可以访问,但是可以使用 Task.Run ,当返回时可以使用它来更新Ui,尽管您必须始终阻止Main/Ui线程退出

    public async void Button1_Click(object sender,EventArgs e)
    {
       await (Async Method Call)
       // Update Ui
    }