Asynchrones Programmieren / Threading

  • C#
  • .NET (FX) 4.0

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Asynchrones Programmieren / Threading

    Hey!

    Ich programmiere mal wieder.

    Mittlerweile habe ich einen Teil des Programms der synchron ausgeführt wird und einen der asynchron ausgeführt wird, in nem neuen Thread.

    Ich habe im synchronen Bereich eine Liste mit Daten, die alle einmal mit UploadValues hochgeladen werden sollen (asynchron).

    Wie stelle ich es an, dass wenn alle Values hochgeladen sind (das kann ich prüfen) er mit dem nächsten Teil synchron fortfährt?

    Denn ne 'if' wird da wohl kaum ausrecihen, er ist ja noch nicht sofort fertig mit hochladen^^

    Stelle mir davor so was wie ne leere while vor oder eine Art goto [line].

    Ideen?[/line]

    reditec schrieb:

    wenn alle Values hochgeladen sind
    muss der Thread ein entsprechendes Event an das Hauptfenster senden. Im entsprechenden Event-Handler kannst Du dann den weiteren Ablauf organisieren, z.B. ge-disablete Controls wieder aktivieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    reditec schrieb:

    wenn alle Values hochgeladen sind
    muss der Thread ein entsprechendes Event an das Hauptfenster senden. Im entsprechenden Event-Handler kannst Du dann den weiteren Ablauf organisieren, z.B. ge-disablete Controls wieder aktivieren.


    Ich rufe die Funktion so auf:

    C#-Quellcode

    1. read(dn, dp, dns, ver, link, updnec, dv, bitos, dnss, updnecls);


    Das hier ist die Funktion:

    C#-Quellcode

    1. private void read(string dn, List<string> dp, List<string> dns, List<string> ver, List<string> link, List<string> updnec, List<string> dv, string bitos, string dnsss, string updnecls)
    2. {
    3. (new System.Threading.Thread(() =>
    4. {
    5. NameValueCollection myNameValueCollection = new NameValueCollection();
    6. WebClient myWebClient = new WebClient();
    7. string response = string.Empty;
    8. bool prgAcc = new bool();
    9. if (Environment.Is64BitOperatingSystem == true)
    10. {
    11. if (dnsss.Contains("Wow6432Node"))
    12. {
    13. bitos = "x86";
    14. }
    15. else
    16. {
    17. bitos = "x64";
    18. }
    19. }
    20. else
    21. {
    22. bitos = "x86";
    23. }
    24. myNameValueCollection.Add("dn", dn + " " + bitos);
    25. //MessageBox.Show(bitos);
    26. byte[] responseArray = myWebClient.UploadValues("http://comptalk.de/cms/iup/version.php", "POST", myNameValueCollection);
    27. response = Encoding.ASCII.GetString(responseArray);
    28. if (response != null)
    29. {
    30. ver.Add(response);
    31. foreach (string dvss in dv)
    32. {
    33. //MessageBox.Show("Wichtig:" + dvss);
    34. int dvsss = int.Parse(dvss.Replace(".", ""));
    35. int dvsssss = int.Parse(response.Replace(".", ""));
    36. if (dvsss < dvsssss)
    37. {
    38. updnec.Add(dn);
    39. prgAcc = true;
    40. //MessageBox.Show("Zu UpdateNec wurde hinzugefügt:" + dvsss.ToString() + "<" + dvsssss.ToString());
    41. }
    42. else
    43. {
    44. prgAcc = false;
    45. //MessageBox.Show("Zu UpdateNec wurde nicht hinzugefügt:" + dvsss.ToString() + "<" + dvsssss.ToString());
    46. }
    47. }
    48. }
    49. responseArray = myWebClient.UploadValues("http://comptalk.de/cms/iup/link.php", "POST", myNameValueCollection);
    50. string linkresponse = Encoding.ASCII.GetString(responseArray);
    51. if (linkresponse != null)
    52. {
    53. if (prgAcc == true)
    54. {
    55. link.Add(linkresponse);
    56. }
    57. }
    58. })).Start();
    59. }


    Aber an welcher Stelle diese if? Was für eine? Und überhaupt eine?

    reditec schrieb:

    Funktion
    Schreib den Lambda-Ausdruck in eine separate Funktion.
    Als letzte Zeile dieser Funktion sendest Du das Event.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    reditec schrieb:

    Lambda?
    Event?
    Was meinst du!?
    Ist dir nicht aufgefallen, dass deine Funktion einen Lambda-Ausdruck enthält?
    Der sich über 62 Zeilen erstreckt - das ist echt ziemlich undurchschaubar.

    Aber ich finde den ganzen Ansatz verfehlt.
    WebClient unterstützt doch asynchronen Upload, warum nutzt du das nicht?
    Wenn du das nutzt, kannst du auch das UploadValuesCompleted-Event behandeln.
    unnötiges Vollzitat entfernt
    - ErfinderDesRades


    Wie soll mir das auffallen, wenn ich nicht weiß, was ein Lambda - Ausdruck ist!?
    Undurchschaubar ist das nicht, zumindest für mich nicht :b
    Kannst du mir bitte erklären, was ich falsch mache und wie ich es richtig mache, bitte beim Richtig machen, zumindest mit Codebeispielen oder Links, die ich trotz Googlen nicht finde :/
    Danke dir für deine Antwort.

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

    ich fürchte, das liefe drauf hinaus, es für dich zu coden.
    Vermutlich ist der Code gar nicht von dir, sonst würdest du den Lambda doch identifizieren können.
    Also mehr als Stichworte liefer ich nicht:
    Gugge WebClient im ObjectBrowser an, finde die asynchrone UploadValues-Methode, hopfe von da aus nach MSDN - vlt. gibts da ja ein Codebeispiel dazu.

    ObjectBrowser ist hier vorgeführt: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Wie paranoid bist du denn bitte!?
    Ich habe vor mehreren Wochen angefangen C# zu lernen.
    Ich lerne das grade.
    Wenn du mir nicht helfen willst, brauchst du mir nicht zu antworten.
    Ich habe dir was von Links geschrieben.
    Wenn du dir meine Frage - History durchschaust sollte dir auffallen, das ich diesen Code definitiv SELBST geschrieben habe.
    Bzw. grade versuche meinen alten Code neuzuschreiben, was mir hier ein par Nutzer geraten haben...
    Jetzt mache ich das und dann sowas...
    Echt nett von dir -.-

    Noch ein aller letztes Mal:

    ICH HABE KEINE AHNUNG WAS EIN LAMBDA IST. ICH HABE DICH DANACH GEFRAGT.
    FAKT IST, DIESER CODE FUNKTIONIERT UND ICH HABE IHN KOMPLETT SELBER GESCHRIEBEN (unter zur Hilfenahme von MSDN und Fragen heir im Forum, zum Beispiel wie man einen neuen Thread öffnet hat mir mal jemand erklärt, wie es vermutlich JEDER ANFÄNGER macht)
    WENN DU DAMIT IRGENDEIN PROBLEM HAST, DANN TUTS MIR SEHR LEID. DAS HIER WAR MEIN LETZTER BESUCH IN DIESEM ***** FORUM.
    hmm?

    sorry, wenn ich sag, was ich denke. Immerhin habe ich dich mit einigen Stichworten versorgt, die du recherchieren kannst, und auch auf ein Tut verlinkt, wo Hinweise zur Recherche gegeben werden.
    Lambda ist übrigens auch so ein Stichwort, mit dem du dir geeignete Msdn-Artilkel ergoogeln kannst.

    Ich scheue mich, so Sachen selbst zu erklären, weil da hängt enorm viel dran, und was ich erkläre, ist zwangsläufig ziemlich halbgar, daher lies das besser selbst nach, auf der Referenz-Dokumentation Msdn.
    Hallo,

    ErfinderDesRades hatte Dir ja doch geholfen, er hat Dir gesagt, wie Du im ObjectBrowser etc. das Zeug nachschauen kannst. Was willst Du mehr?
    Und ich kann nicht glauben, dass Du diesen Code geschrieben hast, Du hast ihn höchstens irgendwo kopiert, ja, das kann sein, also im Sinne von aus einem Thread kopiert o. ä.

    Aber wenn Du nicht weißt, was Lambda ist, kannst Du mir nicht sagen, Du hättest die Zeilen alleine geschrieben.
    Mal davon abgesehen, dass Du "Lambda" einfach mal in Bezug auf .NET in Google eingeben könntest.

    Deine Aussagen sind 1. gegen die Netiquette hier im Forum und 2) machst Du Dir damit nur noch mehr den Weg mit Steinen voll.
    Was soll denn das? Nur weil Du keine Lust hast, Dir das Zeugs anzueignen und irgendwelche Codes willst, um C# "besser lernen zu können" oder was weiß ich, musst Du hier nicht ausfallend werden. Ist ja ok, dass Du EDR vielleicht fragen willst, was Lambdas sind, aber deshalb musst Du ihn nicht angreifen, nur weil er es Dir nicht direkt geantwortet hat...

    Eigeninitiative sollst Du ja schon zeigen, so ist's nicht und außerdem ist es woanders evtl. besser erklärt...
    Wenn Du leicht reizbar bist und dazu neigst, Deine zynische Art rauszulassen, dann bitte ich Dich, das woanders zu tun.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

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

    msdn.microsoft.com/de-de/library/bb397687.aspx

    Was ist eine "anonyme Fumktion"?
    Was sind Typen für Delegaten?
    Was ist eine Ausdrucksbaumstruktur?
    Was sind lokale Funktionen? (Was gibt's sonst noch?)
    Was sind LINQ-Abfrageausdrücke?

    Oder besser: Wofür braucht man so einen Lambda Ausdruck / Was kann er?



    In meinem Code scheint er benutzt zu werden um den Thread zu öffnen.
    Da mir dieser Codeschnipsel allerdings von einem Nutzer hier im Forum geschrieben wurde, als ich wissen wollte, wie man neue Threads eröffnet (weil ich den Backgroundworker nicht gebrauchen kann...), kann ich das nur erahnen.
    vbarchiv.net/forum/id10_i74123…-threads-feststellen.html
    Hier wird das allerdings auf eine interessante Weise erklärt.
    Was hälst du von dieser Methode?
    Oben steht zwar .Net 4.0 aber ich kann auch ein 4.5 Programm schreiben^^
    1. "anonyme Funktion" ist ein anneres Wort für Lambda. Besser wäre, von "anonyme Methode" zu sprechen, denn es gibt auch anonyme Subs
    2. Typen sind vermutlich Datentypen. Was nun speziell Typen für Delegaten sein sollen weiß ich nicht.
    3. Das ist iwas sehr advanced - braucht man nur, wenn man Code zur Laufzeit kompilieren will. Intern brauchts der Compiler natürlich an jeder Ecke
    4. keine Ahnung - Funktionen können private, protected, friend, public sein - ah - vlt ist mit "lokal" ja ein Lambda innerhalb einer Methode gemeint (s.u.) - ja, ergäbe Sinn.
    5. Linq ist auch so ein RiesenThema, was ich dir nicht aussm Bauch heraus erklären kann. Es ist eine Abfragesprache, ähnlich wie Sql, aber es funktioniert nicht mit Datenbanken, sondern beliebige Auflistungen werden abgefragt.
    anonyme Methoden können alles, was normale Methoden auch können.
    Nur kann man sie neckischerweise innerhalb einer richtigen Methode notieren, und an eine Delegat-Variable zuweisen.
    Damit hat man also Methoden innerhalb von Methoden.
    Solch ist für kleine Methoden nützlich, aber in deinem Beispiel total ausgeufert (> 60 Zeilen!)

    Knackpunkt sind die Delegaten. Eine Delegat ist ein Art Zeiger auf eine Methode, und einen Delegaten kannst du auch an eine Variable zuweisen (an eine Delegat-Variable).
    Daher kann man anonyme Methoden notieren, die eiglich gar keinen Methoden-Namen haben, sondern stattdessen direkt an die Delegat-Variable zugewiesen werden.
    Und Threading funktioniert nur mit Delegaten, mit normalen Methoden geht das gar nicht. Man braucht einen Delegaten auf eine (normale oder anonyme) Methode, und diesen kann man asynchron aufrufen.

    Von welcher Methode soll ich was halten? Was Kuno60 im Link da mit Tasks treibt? Ausgezeichnet! 4 Kernels werden parallel beschäftigt. Aber was hat das mit deim Problem zu tun?
    Mit dem Daten-Abruf einer Internet-Addresse kannst du nur einen Kernel beschäftigen.

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

    Hi
    nur so als kleiner Hinweis: Es empfiehlt sich, im Forum Ruhe zu bewahren.
    1. Auf Anschuldigungen, Beleidigungen und Vorwürfe nicht eingehen, bzw. nicht provoziert reagieren. Das gilt insbesondere auch für @Trade und auch für @schaebich und auch @reditec sollte lernen, dass eine Aussage eine Konsequenz mit sich bringt, die man, wenn man die Aussage trifft, auch entgegennehmen sollte und nicht davor davonlaufen.
    2. Aggressives und destruktives Verhalten werden im Allgemeinen nicht toleriert und enden oftmals in Verwarnungen oder Sperrungen und zwar mit gutem Grund.
    3. Finde ich es erstaunlich, dass dir, zumindest in diesem Thema, immer noch geholfen wird. Bei mir wäre Sense gewesen und zwar schon seit deiner Push-Nachricht. Ich hätte das Thema ehrlich gesagt inzwischen geschlossen, hätte nicht @ErfinderDesRades die Moderation hier übernommen, denn so ein Verhalten muss definitiv nicht sein.

    Gruß
    ~blaze~
    1) Ein Annonymer Typ sind das was bei dir in Zeile #3 steht

    C#-Quellcode

    1. (new Threading.Thread() =>

    heißt im Endeffekt nur, dass du ein Objekt bzw einen Instanz erzeugst, es aber keiner Variable zuweist...so ähnlich ist das auch mit anonymen Funktionen. Du schreibst eine auf, gibst der aber keinen Namen

    VB.NET-Quellcode

    1. Dim obj As Object = (Function()
    2. Return new Object()
    3. End Function)

    Sry, weiß leider nur wie ich das in Vb schreiben kann, C# wirds hier auf MSDN erklärt

    2)Meinst du jetzt den Datentyp eines Delegaten oder "Was 'bedeuten' Typen für Delegaten?"...bitte frage neu formulieren, kann man leicht missverstehen

    3)Tut mir leid, auch wenns (eigentlich) gegen die EULA von Vb-Paradise ist, aber Google -> MSDN

    4) "Lokale Funktion" mein in dem Fall nur dass, du die Funktion nocht "global" für die ganze Klasse hast, sondern nur eben für diesn kurzen Zweck gecodet hast. Du kannst die Anonyme Funktion nicht wie jede andere mit NameDerFunktion() aufrufen, sondern hast sie als "Unterfunktion" in deiner Methode fest drinnen. Wenn du sie wiederverwerten willst, dann entweder Strg+C oder ne ganze Methode draus basteln (Link, evtl hilft er weiter)

    5.) 4.) Again: Google -> MSDN

    6.) Computerbase hat da einen Thread, vielleicht hilft der weiter, da "Wikipeter" evtl auch :D

    Wenn du mit Threads arbeiten willst und du noch nicht soweit bist, dann empfehle ich dir (noch) auf Anonyme Klassen/Typen/Methoden zu verzichten.

    Wenn du unparametrisierte Funktionen aufrufen willst

    C#-Quellcode

    1. System.Threading.Thread thread = new System.Threading.Thread(NameDerFunktionOhneParameter);
    2. //thread.IsBackground = true;
    3. thread.Start();


    Wenn du parametrisierte Funktionen aufrufen willst

    C#-Quellcode

    1. System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(NameDerFunktionMitParameter));
    2. //thread.IsBackground = true
    3. thread.Start(new Object); /*Wichtig ist nur, dass du hier ein Object übergeben kannst, musste halt dann in deinerFunktion wieder in den eigentlich gewollten Datentyopen umwandeln*/

    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell