Threads warten bei HttpWebRequest bis sie gegenseitig fertig sind

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von CensoredAlpaca.

    Threads warten bei HttpWebRequest bis sie gegenseitig fertig sind

    Guten Tag,

    ein Problem ist folgendes: Wenn ich mehrere Threads starte um eine POST Abfrage auf unsere Webseite zu machen, scheint es so als würden sich die Threads untereinander absprechen und jeweils nacheinander die Funktion ausführen. Der Grund der Threads war jedoch, dass sie diese Funktion unabhängig von den jeweils anderen Threads durcharbeiten.

    Spoiler anzeigen
    Ich rufe eine von mir vorher auserwählte Anzahl an Threads auf, welche ein DoWork Event bekommen (jeder Thread erhält das selbe Event):

    C#-Quellcode

    1. for (int i = 0; i <= threads - 1; i++)
    2. {
    3. BackgroundWorker bgw = new BackgroundWorker();
    4. bgw.DoWork += ThreadFunction;
    5. bgw.RunWorkerAsync();
    6. Console.WriteLine("Started thread");
    7. }


    Das ist der Code, welchen die Threads solange ausführen, bis eine Liste abgearbeitet wurde:

    C#-Quellcode

    1. public void ThreadFunction(object sender, DoWorkEventArgs e)
    2. {
    3. int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
    4. currIndex++;
    5. while (currIndex <= 5000)
    6. {
    7. int currThreadIndex = currIndex;
    8. CookieContainer logincookie = new CookieContainer();
    9. string postData = "&a=b&b=c&c=d&d=e";
    10. CookieContainer tempCookies = new CookieContainer();
    11. UTF8Encoding encoding = new UTF8Encoding();
    12. byte[] byteData = encoding.GetBytes(postData);
    13. HttpWebRequest postReq = (HttpWebRequest)WebRequest.Create("meineWebseite");
    14. postReq.Method = "POST";
    15. postReq.KeepAlive = true;
    16. postReq.CookieContainer = tempCookies;
    17. postReq.ContentType = "application/x-www-form-urlencoded";
    18. postReq.Referer = "meineWebseite";
    19. postReq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)";
    20. postReq.ContentLength = byteData.Length;
    21. Stream postreqstream = postReq.GetRequestStream();
    22. postreqstream.Write(byteData, 0, byteData.Length);
    23. postreqstream.Close();
    24. HttpWebResponse postresponse;
    25. postresponse = (HttpWebResponse)postReq.GetResponse();
    26. tempCookies.Add(postresponse.Cookies);
    27. logincookie = tempCookies;
    28. StreamReader postreqreader = new StreamReader(postresponse.GetResponseStream());
    29. string pageContent = postreqreader.ReadToEnd();
    30. Console.WriteLine(pageContent);
    31. currIndex++;
    32. }
    33. }


    So sieht das nun aus (die Ausgabe erfolgt mit der ID des Threads, welche die Aufgabe erledigt hat):


    Ich finde auch nicht wirklich Lösungen für das Problem im Internet. Ich habe versucht die einzelnen Instanzen die durch die Funktion entstanden sind zu Disposen, aber das tut es auch nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „CensoredAlpaca“ ()

    Ich finde es etwas kurios ein Programm zu schreiben, das in einer Dauerschleife Anfragen ohne Zweck an einen Server sendet. Das möchte ich vielleicht zunächst mal festhalten. Ich bin etwas skeptisch gegenüber deinen Absichten.

    @Moderation
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    @SystemException
    Ich kann dir gerne eine neue Geschichte erfinden.

    @Bluespide
    Vielen Dank, dass schaue ich mir mal an.

    Update: Leider funktioniert das nicht. Ich habe jeden dort aufgeführten Tipp angewandt. Erlaubt unsere Webseite eventuell nur eine Connection gleichzeitig pro IP? Ich habe leider selbst keinen Zugriff auf die Webseite, aber im Notfall kann ich etwas weiterleiten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „CensoredAlpaca“ ()