2016-10-22 1 views
0

Je travaille sur une application qui va vérifier le serveur FTP et liste tous les fichiers de répertoire, qui fonctionnent parfaitement sans BACKGROUND WORKER mais quand j'utilise Background worker, beaucoup de problème se produit . Le premier problème était que je ne peux pas accéder à ListView à partir de BackGround worker, j'ai utilisé une autre méthode (stocker la liste dans Array, puis Update sur BackGround Worker Process Complete) mais cela n'a pas fonctionné. Ensuite, j'ai utilisé un autre formulaire qui était caché et faisant la même fonction, mais le programme est toujours bloqué à la liste des fichiers FTP. En fait, je veux juste lister les fichiers de ce répertoire (ftp://blah/subdir/[files sont ici]) à ListView1. Comment est-ce possible sans geler l'interface utilisateur? J'ai essayé d'utiliser le travailleur de fond, mais ça n'a pas fonctionné, comment peut-il l'utiliser pour travailler? Voici le codeListe des fichiers de FTP dans ListView en utilisant BackGround Worker en C#

fonction

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; 
    } 

Le code ci-dessus fonctionne, mais gèle l'interface utilisateur, et quand je l'utilise travailleur de fond, certaines des fonctions ne fonctionne pas comme, ne peuvent pas accéder à ListView1 de l'objet il a été créé ou similaire .

... Toute aide Apprécié Merci

Répondre

1

Vous pouvez essayer cette approche - la Invoke exécute l'action sur le fil approprié:

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

Dans votre cas, vous savez que vous n'êtes pas sur la fil interface utilisateur, mais si vous avez une fonction qui pourrait être appelée soit à partir du thread d'interface utilisateur ou un thread de travail, vous devez vérifier 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

Merci beaucoup, cela a fonctionné parfaitement, mais qu'en est-il. et .. ? – SHoCK

+0

Comment puis-je supprimer. et .. [DOTS] – SHoCK

+0

Je ne suis pas familier avec le format de la chaîne que cette requête FTP renvoie, mais si vous pouvez identifier où le nom du répertoire est, vous pouvez vérifier que ce n'est pas '.' ou' .. '. –