C # Concurrency - Bevorzugter Ansatz für lange laufende Aufgaben

8

Wenn während der gesamten Lebensdauer einer Anwendung ein E / A-Listener ausgeführt werden muss, welches CIR-Modell wird bevorzugt, wenn C # 5.0 auf dem Framework 4.5 ausgeführt wird?

Ich habe mich auf die Idee geeinigt, dass ein Erzeuger-Verbraucher-Muster am besten für den Umgang mit dem, was ich empfange, ist, aber welche Infrastruktur sollte es unterstützen?

Wäre eine einfache Thread thread = new Thread(ThreadStart(method)) zu empfehlen? oder vielleicht wäre ein Task oder Async/Await Modell bevorzugt?

Es ist ein bisschen eine schnelle Frage, aber wie ich früh im Design bin, würde ich lieber sicherstellen, dass die Grundlage stark ist. Meine Reaktion auf andere Sprachen ist, dass ein einfacher Thread, der im Hintergrund läuft, am besten ist, aber die Fülle paralleler Frameworks in C # hat mich vom Kurs abgebracht.

Wenn es relevant ist, wird die Pollzeit in meiner Anwendung durch das I / O-Lese-Timeout behandelt.

Aktualisierung:

Die I / O, auf die ich mich beziehe, ist ein FTDI-Gerät, bei dem je nach dem Zustand des On-Board-Controllers jederzeit Bytes vom Gerät an den PC gesendet werden können. Daher muss ich immer bereit sein, die Daten aufzunehmen und zu verarbeiten. Die API, die ich verwende, basiert auf der D2XX-DLL, die vom FTDI-Anbieter bereitgestellt wird.

    
BlackBox 19.02.2014, 16:38
quelle

3 Antworten

3
  

Die I / O, auf die ich mich beziehe, ist ein FTDI-Gerät, bei dem Bytes durch die Taste gedrückt werden können   Gerät an den PC zu jedem Zeitpunkt, je nach dem Zustand der an Bord   Regler. Daher muss ich immer bereit sein, die Daten abzuholen   und es verarbeiten. Die API, die ich verwende, basiert auf der D2XX DLL von   der FTDI-Anbieter.

Eine schnelle Suche findet dieses Dokument . Ein kurzer Blick darauf deutet darauf hin, dass Sie Ihr Gerät für überlappende E / A öffnen müssen, um einen effizienten Listener zu implementieren. Hier ist ein relevanter Beispielcode aus dem Dokument (C ++):

%Vor%

Der entscheidende Punkt hier ist dieser Kommentar: " // schreibe ist verspätet also mach ein paar andere Sachen bis ... " [BTW, ich glaube, es ist ein Tippfehler, dort sollte lesen statt schreiben sein].

Wie wird mit dieser Verzögerung verfahren? Um Ihren Listener asynchron zu machen, müssten Sie asynchron auf das Kernel-Ereignisobjekt warten . Ich habe eine ähnliche Frage beantwortet , wie man es effizient macht. In Ihrem Fall könnte es so aussehen (eine Skizze in C #):

%Vor%

Dieser Code kann und sollte mit einer geeigneten Timeout- und Abbruchlogik verbessert werden. Dann können Sie einfach ReadFtdiAsync in einer Schleife aufrufen:

%Vor%     
Noseratio 20.02.2014, 02:45
quelle
7

Wenn ich Ihren "IO-Listener" richtig interpretiere, dann sollten Sie immer eine kontinuierliche asynchrone Leseoperation haben. Kein Thread ist notwendig.

    
Stephen Cleary 19.02.2014 16:49
quelle
2

Für I / O ist es immer besser, E / A-Completion-Ports die in .net sind in Methoden wie

eingewickelt %Vor%

oder für .net 4.5

%Vor%

ist eine sehr schlechte Idee, einen Thread oder eine Task auf eine synchrone E / A-Operation zu warten

    
Alberto 19.02.2014 16:49
quelle