Frage

Ich habe einige Hochleistungs-File-Transfer-Code, die ich in C # geschrieben, die Async-Programmiermodell mit (APM) Idiom (zB BeginRead / EndRead). Dieser Code liest eine Datei von einer lokalen Festplatte und schreibt sie in eine Steckdose.

Für die beste Leistung auf moderne Hardware, ist es wichtig, mehr als eine hervorragende I / O-Operation im Flug zu halten, wann immer möglich. So habe ich mehrere BeginRead Operationen auf die Datei schreiben, dann, wenn man abgeschlossen ist, habe ich eine BeginSend auf dem Sockel anrufen, und wenn das abgeschlossen ist kann ich einen anderen BeginRead auf die Datei. Die Details sind ein wenig komplizierter als das, aber auf dem hohen Niveau, das die Idee.

Ich habe den APM-basierten Code Arbeits bekommt, aber es ist sehr schwer zu folgen und habe wahrscheinlich subtilen Concurrency Fehler. Ich würde gerne für diese stattdessen TPL verwenden. I figured Task.Factory.FromAsync wäre es fast zu tun, aber es gibt einen Haken.

Alle der E / A-Proben I (ganz besonders die StreamExtensions Klasse in den Parallel Extensions Extras) gesehen habe davon ausgehen, eins nach dem anderen Schreib gefolgt lesen. Dies wird die Art, wie ich brauche nicht durchführen.

Ich kann nicht etwas Einfaches wie Parallel.ForEach oder Extras Erweiterung Task.Factory.Iterate weil die async I / O-Aufgaben verbringen nicht viel Zeit auf einem Worker-Thread verwenden, so Parallel gerade eine andere Aufgabe startet, in potentiell Dutzende oder Hunderte von ergeb Ausstehende I / O-Operationen; viel zu viel! Sie können, dass durch Waiting auf Ihre Aufgaben umgehen, aber das verursacht Schaffung eines Ereignishandle (ein Kernel-Objekt) und eine Blockierung warten auf eine Aufgabe warten Griff, der bindet ein Worker-Thread. Meine APM-basierte Implementierung vermeidet diese beiden Dinge.

Ich habe mit verschiedenen Möglichkeiten, zu spielen um mehrere Lese- / Schreiboperationen im Flug zu halten, und ich habe es geschafft, so mit Fortsetzungen zu tun, die eine Methode aufrufen, die eine andere Aufgabe schafft, aber es fühlt sich ungeschickt, und doesn definitiv‘ t Gefühl wie idiomatische TPL.

Hat jemand mit einem Problem wie dies mit dem TPL rang? Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Wenn Sie sich über zu viele Threads besorgt sind, können Sie einfach Satz ParallelOptions.MaxDegreeOfParallelism auf eine akzeptable Zahl in Ihren Anruf Parallel.ForEach.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top