Hallo an alle,
@ MrSparkle - sorry, hab einiges zu tun und bekomme von euch auch nicht grade wenig und einfache Hausaufgaben. Natürlich bin ich an Lösungen interessiert, nur finde ich weder den Weg noch das Ziel.
Kurz vorab ich bin kein Programmierer oder Entwickler, sondern mache das Ganze als Hobby. Aber ich verstehe oft nicht was ihr schreibt und muss erstmal recherchieren.
Beispiel:
Abt schrieb am 25.09. auf meine Frage:
Im dümmsten Fall eine Race Condition
--> Problem - was ist eine Race Condition???
--> Google + mein Buch Visual C# 2015
Zudem Zeitpunkt hatte ich parallele und asynchron nicht verstanden und fällt mir leider immer noch schwer. Denn es gibt Asynchrone-Programmierung die nicht asynchron ist und Parallele-Programmierung die nicht parallel ist.
Es folgte die Aussage ich soll besser erklären, habe ich versucht.
Im Grunde hätte mir aber als Antwort bereits ausgereicht das B zutrifft.
Die Änderungen am Objekt wirken sich auf den Task aus und umgekehrt.
--> Ergebnis es wird mit dem Task kein neues Objekt erzeugt, sondern das alte durchgereicht.
Wäre bei mir aber kein Problem, weil ich das Objekt eigentlich bis zum nächsten Schleifendurchgang unverändert bleibt. Somit müsste ich nur am Ende der Schleife warten.
Beispiel:
C#-Code: |
foreach (var objekt in Objekte)
{
var meinTask = Task.Run(() => MeinTask(objekt));
…..
….
meinTask.Wait();
}
|
Die Aussage von Abt vom 25.09 16.48 bringt mich nur bedingt weiter.
asynchrones Problem mit Parallelität zu lösen
--> Ich versteh leider den Unterschied nicht.
Klar Parallelität läuft gleichzeitig zum bestehenden Programm, aber Asynchron doch auch?!?
Natürlich kann ich auch
myThread = new Thread(meinObjekt)
und await machen
Aber dann würde es „meinObjekt“ beim nächsten Schleifendurchlauf doch auch ändern.
Der Hinweis auf einen Artikel mit „Drei-Schichten-Architektur“ brachte mich leider nicht weiter. Man könnte mir auch einen Link zu einem Buch in Amazon schicken. Würde mir genauso helfen. Am besten noch als affiliate link (nur spaß).
Kritik wie die vom Abt vom 28.09.2020 – 13.52 bringt halt nichts.
Was bringt es das Problem genannt zu bekommen, wenn man nach einer Lösung sucht?
Ein einfaches versuch doch:
myThread = new Thread(meinObjekt)
und dort im Thread machst du ein neues meinObjekt und weißt das übergebene zu.
Dann hast du eine Kopie und der Hauptthread änderst sich nicht.
@ T-Virus – danke für deinen Hinweis.
Werde mich bei Gelegenheit mal in Bulk Inserts einarbeiten.
Vermutlich aber nicht notwendig, da das Programm als Service arbeitet und in der Regel weniger als 100 Objekte in der Minute verarbeitet.
@JimStark, es muss nicht Parallel laufen. Im übrigen läuft es nicht Parallel.ForEach, sondern aus einer normalen ForEach-Schleife möchte ich eine weitere Verarbeitung starten (egal ob Thread oder Task).
Ziel ist es meine zwei Prozessoren auszulasten und das Programm zu beschleunigen.
Das müsste aber bei beiden passieren?!?
Problem es gibt keine einfache Beschreibung was der Unterschied zwischen Parallel und Asynchron ist.
Ohne solche Sätze wie:
Parallele Verarbeitung vs. Order Preservation sind gegensätzliche Anforderungen.
Das Einhalten einer Order ist extrem kostenintensiv; daher gibt es weder in PLINQ noch in der TPL entsprechende Funktionalitäten
Man könnte auch japanisch mit mir sprechen, würde ich genau soviel verstehen.
Egal, ich werde weiter lesen, suchen, youtube-Videos schauen und hoffentlich eine Antwort finden.
Bei euch allen möchte ich mich für eure Unterstützung bedanken und auch wenn ich Kritik an Abt ausgesprochen habe, hinsichtlich der für Anfänger weniger geeigneten Antworten, möchte ich mich auch bei Abt bedanken. Nicht zuletzt, dass er hier für das Forum wirklich viel macht und immer schnell Antwortet. Hoffe ich bin mit meiner Frage keinem auf die Füße getreten.
Gruß
ck