Zum Copy.
CopyAsync führt das ganze über die Windows API (
CopyFile Win32) aus. Nichts anderes als die Copy()-Methode in einem Task.
TransferJobs sind Implementierungen von mir, die erst die Datei schrittweise lesen und übertragen (über Streams).
Nach jedem Lesen von standardmäßig einem Chunk, also Dateiabschnitt (Standard 1024 Bytes) wird dieser transferiert.
Ich kann hier Lesen und Schreiben ohne größeren Aufwand nicht parallel machen (Pipeline), da ich .NET 2.0 unterstützen will.
Du kannst versuchen den Chunk zu vergrößern, indem Du den BufferSize im Konstruktor nach oben veränderst.
Der Standard ist 1024 Bytes, da dies der geringste Wert darstellt, der empfohlen wird, da ansonsten der interne Windows Buffer zu oft aufgerufen wird.
Je kleiner der Buffer desto öfter werden die Events aufgerufen und desto genauer sind die berechneten Aussagen zu Laufzeit und Kopiergeschwindigkeit.
Bei neuen Systemen wird 4KB als "üblicher Wert genannt" - vermutlich sollten bei GBit-Anschlüssen im lokalen Netzwerk auch höhere Werte noch zu vernünftigen Aussagen führen.
Letzten Endes wird eine Datei durch das Übertragungsprotokoll sowieso geteilt.
Es bietet sich also an, dass der Chunk so groß ist wie das Frame des Übertragungsprotokolls. So vermeidet man Overhead; aber da gibt es nie eine Pauschale, die man hier anwenden könnte.