Multithreading

2018-12-09 10:54
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ć?

edytowany 2x, ostatnio: Gesty01, 2018-12-09 10:55

Pozostało 580 znaków

2018-12-09 12:25
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.

edytowany 1x, ostatnio: Piotr Chojnacki, 2018-12-09 12:25

Pozostało 580 znaków

2018-12-09 12:32
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ć.

Samo dodanie async nic mu nie da :P - some_ONE 2018-12-09 12:39
> użyj HttpClienta, który ma asynchroniczne metody. - error91 2018-12-09 13:59
No i dalej samo użycie async nic mu nie da. Trzeba trochę bardziej zmodyfikować kod, więc pisanie, że dodaj async i będzie działać po zmianie na HttpClient to zbyt duże uproszczenie (co widać po jego kolejnej odpowiedzi). - some_ONE 2018-12-09 15:05

Pozostało 580 znaków

2018-12-09 12:39
0

https://4programmers.net/Forum/1515528

Polecam tak zrobić jak w załączonym poście - Michalk001 2018-12-10 09:24

Pozostało 580 znaków

2018-12-09 12:54
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 :/

edytowany 2x, ostatnio: Gesty01, 2018-12-09 12:56
Obejdzie się bez dodania wątków. Wątki do pobierania zawartości z sieci to głupi pomysł. Wystarczy, że przeczytasz posta, którego podlinkowałem... - some_ONE 2018-12-09 15:03

Pozostało 580 znaków

2018-12-09 14:50
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ś.

Pozostało 580 znaków

2018-12-09 17:43
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);
}
edytowany 1x, ostatnio: Gesty01, 2018-12-09 17:52
Co to znaczy nie działa? - Patryk27 2018-12-10 09:28

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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