2016-10-22 28 views
0

我正在研究一個將檢查ftp服務器並列出目錄的所有文件的應用程序,該工作完美無缺的背景工作,但是當我使用後臺工作時,發生了很多問題。 第一個問題是我無法從BackGround工作者訪問ListView,我使用了另一種方法(將數組存儲在Array中,然後在BackGround工作進程中完成更新),但它沒有奏效。 然後我使用了另一個隱藏的功能,並執行相同的功能,但程序仍停留在列出的FTP文件中。 實際上,我只是想列出這個目錄的文件(ftp://blah/subdir/[files在這裏)到ListView1。如何在沒有冷凍UI的情況下實現?我試圖使用後臺工作,但它沒有工作,如何使用它的工作? 這裏是代碼使用C#中的BackGround Worker在ListView中使用FTP列出文件

功能

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

你可以試試這個方法 - 在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); 
} 
+0

謝謝你這麼多,這工作完美,但那又如何。和..? – SHoCK

+0

我如何刪除。和.. [DOTS] – SHoCK

+0

我不熟悉這個FTP請求返回的字符串格式,但是如果你能確定目錄名稱的位置,你可以檢查它不是'.'或'.. '。 –

相關問題