Multithreading

0

Witam serdecznie :D Mamy tutaj do czynienia z aplikacją Windows Form.
Stworzyłem program który wykonuje pewną czynność po wciśnięciu przycisku załączając w to 2 pętle.

private void BStart_Click(object sender, EventArgs e)
   for (int i = 0; i < 10000; i++)
      for (int j = 0; j < 10000; j++)
         ...
         try
         {
            WebResponse Response = Request.GetResponse();
         }
         catch
         {
         }
      }
   }
}

Wiem że po dodaniu threads ta czynność może wykonać się znacznie szybciej. Mógłby ktoś opisać w jaki sposób mogę je załączyć?

0

A po co tam są dwie pętle? To samo osiągnąłbyś jedna pętla z iteracja do 10000000. I obecnie nie byłoby żadnej różnicy bo masz zagnieżdżone pętle a nie dwie osobne.

0

Używasz jakiejś starej wersji .NET'a ? Jeśli nie to użyj HttpClienta, który ma asynchroniczne metody. Dodaj do metody event handlera słowko async i będzie działać.

0
error91 napisał(a):

Używasz jakiejś starej wersji .NET'a ? Jeśli nie to użyj HttpClienta, który ma asynchroniczne metody. Dodaj do metody event handlera słowko async i będzie działać.

Załączyłem async do eventu:

private async void BStart_Click(object sender, EventArgs e)

A tutaj response:

var Response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(Request.BeginGetResponse, Request.EndGetResponse, null);

Ale nadal jest za wolne. Myślę że bez dodania wątków się nie obejdzie :/

0

Nadal nie użyłeś HttpClienta

private async void BStart_Click(object sender, EventArgs e)
 var tasks = new List<Task<HttpResponseMessage>>();
var httpClient = new HttpClient();
   for (int i = 0; i < 10000; i++)
      for (int j = 0; j < 10000; j++)
         ...
         try
         {
             tasks.Add(httpClient.GetAsync()) // tutaj  skonfiguruj swój request
         }
         catch
         {
         }
      }
   }
Task.WhenAll(tasks);
}

Pisałem to bez IDE więc pewnie gdzieś jest jakaś literówka czy coś.

0
error91 napisał(a):

Nadal nie użyłeś HttpClienta

private async void BStart_Click(object sender, EventArgs e)
 var tasks = new List<Task<HttpResponseMessage>>();
var httpClient = new HttpClient();
   for (int i = 0; i < 10000; i++)
      for (int j = 0; j < 10000; j++)
         ...
         try
         {
             tasks.Add(httpClient.GetAsync()) // tutaj  skonfiguruj swój request
         }
         catch
         {
         }
      }
   }
Task.WhenAll(tasks);
}

Pisałem to bez IDE więc pewnie gdzieś jest jakaś literówka czy coś.

Nie działa :/

private async void BStart_Click(object sender, EventArgs e)
   var Tasks = new List<Task<HttpResponseMessage>>();
   for (int i = 0; i < Table1; i++)
      for (int j = 0; j < Table2; j++)
         ...
         HttpClient Client = new HttpClient();
         string Encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("UTF-8").GetBytes(Login + ":" + Pass));
         Client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue( "Basic", Encoded );
         try
         {
            Tasks.Add(Client.GetAsync(URL));
            listBox1.Items.Add("Witamy");
         }
         catch
         {
         }
      }
   }
   Task.WhenAll(Tasks);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1