winforms - 从其他线程更新UI

标签 winforms multithreading asynchronous

我知道这个问题以前曾被问过,但我觉得没有被正确地问过。

我需要进行大量操作,并且希望UI保持响应状态。我读过几篇文章说,背景 worker 是最好的选择,但是,我认为这是假设您已经掌握了繁重任务的源代码。

我有一个我没有源代码的库,检查进度的唯一方法是将事件附加到事件中并以这种方式获取信息。

我在MSDN站点上看到的示例假定一个源即可。

我知道如何通过附加事件来获取进度(这是一个百分比值),但是如何将该值返回给UI?

最佳答案

下面的答案是基于我的直觉,实际上并没有对第三方库进行测试。

  • 像平常一样在一个简单的后台线程(不是BackGroundWorker)中调用您的第三方库代码。
  • 将库组件的事件附加到代码中的常规事件处理程序中(旨在更新UI)。
  • 在事件处理程序中,代码应如下所示:
    private void EventHandler(object sender, DirtyEventArgs e)
    {
        if (myControl.InvokeRequired)
            myControl.Invoke(new MethodInvoker(MethodToUpdateUI), e);
        else
            MethodToUpdateUI(e);
    }
    
    private void MethodToUpdateUI(object obj) 
    {
        // Update UI
    }
    
  • 关于winforms - 从其他线程更新UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/724972/

    相关文章:

    c# - 无法将自定义 ActiveX 控件添加到 .NET Core WinForms 应用程序,但 .NET Framework 应用程序工作正常

    java - 多线程FTP下载

    java - 将绑定(bind)添加到无界队列

    javascript - 如何在node.js中以异步方式多次(动态)调用一个方法

    javascript - Promise 从 `catch` 中调用 `then`

    c# - C# 中的复选框数组

    c# - 以编程方式单击按钮 C#

    android - 使用线程启动 Activity

    c++ - boost::asio::streambuf 通过 https 检索 xml 数据

    c# - 图像变量到 byte[] 数组