2011-04-29 4 views
0

J'utilise WebBrowser Control dans C# pour vérifier quelques résultats du moteur de recherche, mais parfois sans raison. Ma première pensée a été de faire de chaque fonction de recherche un thread et d'utiliser thread.abort() à partir d'une minuterie, mais je ne pouvais pas gérer avec les contrôles de l'interface utilisateur (y compris le WebBrowser), peu importe ce que j'ai essayé. Quelqu'un a une solution pour moi? un exemple serait grand parce que j'ai déjà essayé tant de choses et je continue à obtenir toutes ces exceptions.Accès aux contrôles via les threads

+2

Quel est exactement ce que vous voulez vérifier sur ces moteurs de recherche? Pourquoi utilisez-vous un WebBrowser? Tu ne peux pas utiliser un HttpRequest? –

Répondre

1

Je crois que vous pouvez utiliser WebRequest dans un environnement de travail & pour éviter les difficultés de traitement du modèle de thread COM. Vous pouvez utiliser WebRequest.Timeout pour gérer tout ce que vous pensez prendre trop de temps.

Essayez quelque chose comme ceci:

static void Main(string[] args) 
    { 
     BackgroundWorker bg = new BackgroundWorker(); 
     bg.DoWork += backgroundWorker_DoWork; 

     bg.RunWorkerAsync(new List<object> { "http://download.thinkbroadband.com/512MB.zip" }); 
     while (true) {} 
    } 

    private static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Console.WriteLine("Starting operation."); 
     BackgroundWorker bw = sender as BackgroundWorker; 

     List<object> args = (List<object>)e.Argument; 

     var url = (string)args[0]; 
     WebRequest request = WebRequest.Create(url); 
     request.Timeout = 300; 

     try 
     { 
      WebResponse response = request.GetResponse(); 
      Console.WriteLine("Request successful."); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Request timed out."); 
     } 
    } 

WebBrowser est un composant que vous devez utiliser lorsque vous souhaitez intégrer une instance de IE dans votre couche de présentation. Sauf si vous en avez besoin, vous pouvez utiliser quelque chose de plus léger.

0

Utilisez la méthode .invoke() du contrôle: http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

Il existe d'autres méthodes que vous pouvez utiliser aussi: .BeginInvoke et .EndInvoke pour asynchrone invoque.

if(control.InvokeRequired) 
{ 
    control.Invoke(control.delegate); 
} 
Questions connexes