【问题标题】:Update UI element from a different class running in background thread从后台线程中运行的不同类更新 UI 元素
【发布时间】:2015-04-16 19:47:39
【问题描述】:

我的项目陷入了死胡同。我在我的 Form1 中运行 BackgroundWorker (在 FTPclient 类中),它像这样在不同的类 (称为 FTPengine) 中启动 FTP 文件下载功能(称为下载) .

(我自然地在后台线程中运行它,因此当从 FTP 下载大数据时 UI 不会卡住。)

private void download_DoWork(object sender, DoWorkEventArgs e)
{
    ftp ftpClient = new ftp(parameters[0], parameters[1], parameters[2]); //Init connection
    ftpClient.download(file, localfile); //Start download
}

我有一个名为“报告进度”的函数(在 FTP 引擎类中),它返回两个整数(以字节为单位的文件大小和当前下载的字节)。我需要将这两个整数返回给 UI 线程并将进度报告到 ProgressBar 元素中。

我多次尝试使用调用方法和 Backgroundworker reportprogress,但由于代码实际上并不直接在 backgroundworker 中,而是在完全不同的类中,所以我没有运气。我搜索了网络等等,但没有结果。如果有人知道需要进行哪些更改,将不胜感激。

【问题讨论】:

    标签: c# multithreading class ftp backgroundworker


    【解决方案1】:

    如果可以访问Dispatcher,可以调用

    Dispatcher.RunAsync(priority,()=>
    {
      //The Action with the parameters
    });
    

    根据版本,方法会发生变化

    如果你在那个地方没有访问权限,你可以使用 App.RootFrame.Dispatcher 或 Window.Current.Dispatcher,这一切都取决于你正在创建的应用程序的版本。

    添加

    对于 Windows 窗体

    BeginInvoke((Action)(() =>
            {
                //Do what you need
            }));
    

    然后在 UI 中处理您需要的内容

    【讨论】:

    • 胡安您好,感谢您的快速回复。您能否发布任何使用您的建议的特定示例?如果我想使用调度程序,我最终会遇到一堆错误(...名称“调度程序”在当前上下文中不存在等)
    • 一个普通的 Windows 窗体应用程序。 (FTPclient) 和类库 (FTPengine)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2018-07-16
    相关资源
    最近更新 更多