从后台线程中运行的其他类更新UI元素

时间:2015-04-16 19:47:40

标签: c# multithreading class ftp backgroundworker

我的项目陷入了死胡同。我正在我的Form1中运行BackgroundWorker (在类FTPcllient中),它在另一个类(称为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
}

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

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

1 个答案:

答案 0 :(得分:1)

如果您可以访问Dispatcher,则可以致电

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

取决于方法更改的版本

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

ADDED

对于Windows窗体

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

并在UI中处理您需要的内容