使用C#中的BackGround Worker在ListView中从FTP列出文件

时间:2016-10-22 19:39:18

标签: c# listview ftp backgroundworker

我正在研究一个应用程序,它将检查ftp服务器并列出目录的所有文件,在没有后台工作器的情况下完美工作但是当我使用后台工作程序时,会出现很多问题。 第一个问题是我无法从BackGround worker访问ListView,我使用了另一种方法(将列表存储在Array中,然后在BackGround Worker Process Complete上存储),但它确实有效。 然后我使用另一个隐藏并执行相同功能的表单,但该程序仍然坚持列出FTP文件。 实际上,我只想列出这个目录的文件(ftp://blah/subdir/[files在这里])到ListView1。没有冻结用户界面怎么可能?我试图使用背景工作者,但它确实有效,如何使用它工作? 这是代码

功能

public string[] ListDirectory()
    {
        string hostdir = textBoxX2.Text + textBoxX3.Text;
        var request = createRequest(hostdir,WebRequestMethods.Ftp.ListDirectory);
        using (var response = (FtpWebResponse)request.GetResponse())
        {
            using (var stream = response.GetResponseStream())
            {
                using (var reader = new StreamReader(stream, true))
                {
                while (!reader.EndOfStream)
                {
                 listView1.Items.Add(reader.ReadLine());
                }
            }   
         }
      }
        List<string> l = new List<string>();
        return l.ToArray();
}
private FtpWebRequest createRequest(string uri, string method)
    {
        var r = (FtpWebRequest)WebRequest.Create(uri);
        r.Credentials = new NetworkCredential(textBoxX4.Text, textBoxX5.Text);
        r.Method = method;
        return r;
    }

上面的代码工作但冻结了UI,当我使用后台工作程序时,某些功能不起作用,无法从它创建的对象或类似的东西访问ListView1。

任何帮助赞赏...... 感谢

1 个答案:

答案 0 :(得分:1)

您可以尝试这种方法 - Invoke在相应的线程上运行操作:

string line = reader.ReadLine();
listView1.Invoke((MethodInvoker)delegate {
    listView1.Items.Add(line); // runs on UI thread
});

在你的情况下,你知道你不在UI线程上,但如果你有一个可以从UI线程或工作线程调用的函数,你需要检查InvokeRequired

string line = reader.ReadLine();
if ( listView1.InvokeRequired ) {
    listView1.Invoke((MethodInvoker)delegate {
        listView1.Items.Add(line); // runs on UI thread
    });
}
else {
    // we're already on UI thread - work on ListView1 directly
    listView1.Items.Add(line);
}