Laden...

Task Klasse : Eine List aus Tasks mit Parameter und Rückgabewerten

Erstellt von jok3r89 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.565 Views
J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren
Task Klasse : Eine List aus Tasks mit Parameter und Rückgabewerten

Hallo,
leider bisher nicht ganz so fündig geworden.

Ich schreibe gerade an einer Klasse die mir Task (Kommunikation) verwaltet bzw. parallelisiert.
Ist das hier Thread sicher? Mir geht es um das Datenübergeben?
Wo ich mich gerade gar nicht hinaus sehe wie bekomme die Streams in die Liste ?



	static class Scheduler
	{
		static private IModel _model;
		static private PLCProvider _provider;
		static private List<Task> taskList;
		static private List<byte[]> streamList = new List<byte[]>();

		static public void Start_PAE(List<PLCTyp> plcList)
		{
			taskList = new List<Task>();
		
			foreach( PLCTyp plc in plcList)
			{
				Task task = new Task((myData) => 
				{
					PLCTyp c = (PLCTyp)myData;
.........
......
					
				},plc);
				taskList.Add(task);

			}
			Task.WaitAll(taskList.ToArray());

		}

		static public void Stop()
		{
			
		}
	}



16.834 Beiträge seit 2008
vor 5 Jahren

Erklärt doch erst mal, was Du überhaupt tun willst.
Eigentlich gibt es fast kein Grund irgendeinen Task Scheduler selbst zu schreiben.

Und wenn man mit Tasks arbeitet, sollte man auch immer (wenn möglich) asynchron arbeiten.
WaitAll gilt als Pitfall.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Also zur Erklärung, Ich habe einen Controller geschrieben der via TCP/IP mit Maschinen kommunizieren soll.

Eine Controller Instanz arbeitet Sequentiell Anfragen ab( Die Anzahl ist Variable).

jetzt kann es eben mehrer Controller bzw. Maschinen geben.

Die Abarbeitung sollte sehr schnell von statten gehen, daher soll jeder Controller auf einen Task ausgelagert werden.

Jedem Task muss ich anfangs die Verbindungsdaten übergeben und anschließend sollte der empfangene Stream zurück geliefert werden.
Wenn alle Tasks beendet sind wird ein Skript gestartet.

Hinweis von Abt vor 5 Jahren

Bitte keine Full Quotes
[Hinweis] Wie poste ich richtig?

16.834 Beiträge seit 2008
vor 5 Jahren

Warum muss ein Controller das Wissen eines Tasks haben?

Im Prinzip hast Du nur ein simplen Data Flow.
Dafür gibt es zig umsetzungsweisen, zB. Walkthrough: Creating a Dataflow Pipeline bzw. Dataflow (Task Parallel Library)

Gerade (Netzwerk-)Kommunikationen sollten aber unbedingt asynchron sein!

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Warum muss ein Controller das Wissen eines Tasks haben?

Ich glaube hier kommt gerade was durcheinander, die Benennungen sind evtl. noch nicht so eindeutig....

Zyklisch werden alle Daten von den Maschinen gelesen und nur wenn alle Lesevorgänge Fertig sind darf mit den empfangen Daten weiter gearbeitet werden.

Diese Daten werden anschließend für eine Skript gebraucht.

Ist das Skript abgearbeitet werden die aktualisierte Daten zu den Maschinen gesendet.
Stur nach dem EVA Prinzip, das muss umbedingt eingehalten werden.

Ich könnte jetzt Sequenziell jede Maschine nach einander abfragen, nur das würde zulange dauern.
Ich hoffe ich hab das jetzt verständlich rüber gebracht.

Ich habs das von mir gerade noch vervollständigt, evtl erkennt man jetzt besser was gemeint ist


static class Scheduler
	{
		static private IModel _model;
		static private List<Task> taskList;
		static private List<byte[]> streamList = new List<byte[]>();

		static public void Start_PAE(List<PLCTyp> plcList)
		{
			taskList = new List<Task>();
		
			foreach( PLCTyp plc in plcList)
			{
				Task task = new Task((myData) => 
				{
					PLCTyp c = (PLCTyp)myData;
					PLCWorker worker = new PLCWorker(c);
					worker.Connect();
					var recv = worker.Read(); //sollte zurück geliefert werden
			
				},plc);
			
				taskList.Add(task);

			}
			Task.WaitAll(taskList.ToArray());

		}


2.079 Beiträge seit 2012
vor 5 Jahren

Ich bin da jetzt auch kein Experte, aber wenn ich mir nur die Beispiele im zweiten von Abt verlinkten Artikel so anschaue, sieht das nach exakt dem aus, was Du brauchst. Die Ausführungsblöcke dürften besonders spannend sein.

Schau dir das doch einfach Mal an, bestimmt klären sich dabei einige Fragen, immerhin bist Du laaaaangeee nicht der Erste mit dieser Problemstellung.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.834 Beiträge seit 2008
vor 5 Jahren

Palladin, ist es auch.
Aber er möchte vermutlich eher Sturr seine Basis weiter führen, statt es mit einem stabilen, etablierten Pattern zu machen - jedenfalls mein Eindruck.

2.079 Beiträge seit 2012
vor 5 Jahren

Das denke ich auch. Daher meine Nachricht, ich wollte noch Mal extra deutlich darauf hinweisen, dass es das, was er will, schon lange gibt, er muss es nur noch benutzen.

Aber wenn er spätestens jetzt nicht will - selbst schuld 😄

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ne mit stur hat das nicht zu tun, ich kannte das eben bisher nicht. Ich hatte so eine Problemstellung bisher auch nicht zum bewältigen. Ich hatte auch gedacht die Task Parallel lib läst es nicht zu daten zu übergeben und anschließend Daten zurück zulieferer. Ich werde mir das aber auf alle Fälle mal ansehen, danke!
Grüße

5.658 Beiträge seit 2006
vor 5 Jahren

Natürlich geht das. Dazu gibt es Task<T> bzw. Task.Result.
Aber deine ganze Herangehensweise ist, wie schon mehrfach erläutert, nicht zu empfehlen. Lies dir doch mal einen Artikel zu Asyncroner Programmierung bzw. async/await durch, dann würden sich solche Fragen von allein beantworten. Du solltest bei soetwas nicht davon ausgehen, daß du der erste bist, der vor einem solchen Problem steht.

Weeks of programming can save you hours of planning

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Meine aktuelle Lektüre hat mich eigentlich dazu gebracht... aber ja ich teste diese Example Projekte mal und schaue mir das mal genauer an.

Ich weiß auch gerade nicht ob ich bei mir noch von Asynchron sprechen kann weil ich umbedingt warten das alle Threads fertig sind.

16.834 Beiträge seit 2008
vor 5 Jahren

Bitte les Dir die Grundlagen durch.
Asynchrone und parallele Programmierung sind zwei paar Stiefel. Wenn Dir das unbekannt ist, dann solltest Du erst mal mit Kapitel 1 beginnen.

Man kann genauso asynchron auf parallele Aktionen warten, aber eben asynchron mit WhenAll und nicht blockierend mit WaitAll.
Aber mit einem entsprechenden Datenfluss brauchst Du eigentlich überhaupt kein Warten, sondern kannst mit Continue arbeiten.

Und Kommunikation-Code sollte immer asynchron sein.
Ich hab Dir die Artikel nicht aus Langeweile gegeben. Wenn Du nur stocherst, dann knallt Dein Code mit Anlauf.