2016-10-13 2 views
-1

Я пытаюсь получить мою голову вокруг нитей, в моих текущих потоках приложения будет лучшим способом справиться с этим, то, что у меня есть:Начиная использовать темы

public void threadsTest() { 
     Invoke(new MethodInvoker(() => { 
     // loop over the listview getting the first value 
     foreach (ListViewItem item in listViewBacklinks.Items) 
     { 
      // try... 
      try 
      { 
       var mainURL = item.Text; 
       using (WebClient wc = new WebClient()) 
       { 
        try 
        { 
         var pageHtml = wc.DownloadString(mainURL); 
         if (pageHtml.Contains(Text)) 
         { 
          var subitems = item.SubItems.Add("<a href=\"" + item.SubItems[1].Text + "\">anchor text</a>"); 
          item.BackColor = Color.Green; 
         } 
         else 
         { 
          item.BackColor = Color.Red; 
         } 
        } catch (Exception) 
        { 
         item.BackColor = Color.Red; 
        } 
         //Helpers.returnMessage("Work done!"); 
        } 
       } catch (Exception ex) { 
       Helpers.returnMessage(ex.ToString()); 
      } 
     }})); 
    } 

    private void btnAnalyzeAnchorText_Click(object sender, EventArgs e) 
    { 
     // attempting threads 
     var t = new Thread(threadsTest); 
     t.Start(); 
    } 

Я думал, как BackgroundWorker так ли не затормозил бы GUI, но он сделал так, чтобы я включил вызов для доступа к элементам GUI, я не думаю, что это выглядит правильно, так как теперь графический интерфейс остается невосприимчивым, пока работа не будет выполнена, я просмотрел некоторые учебники но он не полностью погружается, любая помощь/советы по крекингам будет отличной.

+0

'Invoke()' запускает данный код в потоке пользовательского интерфейса, поэтому неудивительно, что ваш интерфейс заблокирован. Invoke/BeginInvoke - только самая маленькая часть кода, которую вы можете (например, установка BackColor здесь). Если ваш список слишком велик, вы часто можете столкнуться с проблемами с обновлением пользовательского интерфейса. Я бы предложил заглянуть в async/wait, поскольку это был бы более элегантный способ делать то, что вы пытаетесь. –

+0

Возможный дубликат процесса [C# run без замораживания моего графического интерфейса приложения] (http://stackoverflow.com/questions/2773448/c-sharp-run-process-without-freezing-my-apps-gui) –

+0

WebClient - это GUI, поэтому ваше приложение просто не подходит для потоковой обработки ... –

ответ

0

Это то, что вам нужно сделать:

public void threadsTest(string[] urls) 
{ 
    var results = new Dictionary<string, string>(); 
    foreach (string mainURL in urls) 
    { 
     using (WebClient wc = new WebClient()) 
     { 
      var pageHtml = wc.DownloadString(mainURL); 
      results[mainUrl] = pageHtml; 
     } 
    } 
    Invoke(new MethodInvoker(() => ProcessResults(results))); 
} 

Там нет элементов пользовательского интерфейса в этом коде, просто тяжелый подъем WebClient.

Затем в новом ProcessResults вы вернулись в поток пользовательского интерфейса, чтобы вы могли установить свои результаты.

Призыв к потоку должен пройти через массив URL-адресов (строк), но вы получите это до создания потока, чтобы вы все еще находились в потоке пользовательского интерфейса, и поэтому это безопасно.

Смежные вопросы