Die .NET Image.Save-Methode erzeugt unter Windows 64 Bit nicht reproduzierbare Ergebnisse

8

Ich benutze .NET Framework (versucht 3.5 & amp; 4.0), um eine .TIFF-Datei zu laden und sie als .PNG zu speichern. Ich erwarte zwei aufeinanderfolgende Aufrufe der Save () - Methode (die dieselbe TIFF-Datei verwendet), um dieselbe PNG-Datei zu erstellen. Die produzierten Dateien sind jedoch "manchmal" anders.

Der folgende C # -Code zeigt das Problem:

%Vor%

Dadurch wird "Diff" bei Iteration 8, 32, 33, 73, 114, 155, 196 unter Windows 64 angezeigt, während auf 32-Bit-Maschinen keine Fehler angezeigt werden. (Ich benutze x86 Ziel; mit x64 Ziel ist es schlechter: diff bei Iteration 12, 13, 14, 15, ...)

Gibt es eine Möglichkeit, ein reproduzierbares Ergebnis von Save () zu erhalten?

Ein Beispielbild finden Sie auf dieser FTP-Site

    
werner 14.05.2012, 15:38
quelle

1 Antwort

2

Ich kann nicht erklären, warum das passiert, aber es scheint, dass die nicht-deterministische Finalisierung der Image -Objekte im Finalizer-Thread die Codierung von Bildern im Hauptthread beeinflusst. ( Image implementiert IDisposable , Sie sollten also Dispose aufrufen, um es deterministisch zu bereinigen, wenn Sie es nicht mehr verwenden; andernfalls wird es zu einem beliebigen Zeitpunkt in der Zukunft fertiggestellt.)

Wenn ich Ihren Beispielcode in den folgenden ändern, bekomme ich die gleichen Ergebnisse von jedem Aufruf von Save :

%Vor%

Beachten Sie, dass ich eine weitere Besonderheit gefunden habe: Beim Ausführen eines 32-Bit-Builds (x86) unter Windows 7 SP1 x64 haben die ersten zwei Aufrufe an Save unterschiedliche Ergebnisse zurückgegeben, dann alle nachfolgenden Aufruf von Save erzeugte die gleiche Ausgabe wie der zweite Aufruf. Um den Test zu bestehen, musste ich die ersten beiden Zeilen (vor der Schleife) wiederholen, um zwei Speicherungen zu erzwingen, bevor die Gleichheitsprüfungen durchgeführt wurden.

    
Bradley Grainger 09.06.2012, 20:32
quelle

Tags und Links