Efter en masse test fandt jeg til sidst ud af, at problemet slet ikke var i Entity framework eller NpgSql, men forsinkelsen, jeg så, var forårsaget af skrive-caching. Jeg skrev altid en 30MB fil, før jeg indsatte en række i tabel 1, og jeg troede, at filskrivningen blev udført efter File.WriteAllBytes vendte tilbage, så det ville ikke påvirke eventuelle fremtidige tidsudsagn. Men på OS-laget var det ikke rigtig færdigt at skrive til disk, da insert-sætningen blev kørt, hvilket forårsagede, at insert-sætningen blev kunstigt forsinket.
Jeg beviste dette med følgende kode:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
stopur 1 viste, at File.WriteAllBytes altid tog omkring 500 ms, derefter tog stopur 2 omkring 20 til 30 sekunder.
Hvis jeg ændrer MethodThatInsertsIntoTable1 for at indsætte i en anden tabel, tager det stadig 20 til 30 sekunder uanset tabel.
Hvis jeg øger Thread.Sleep(1000) til Thread.Sleep(30000), så registrerer stopur 2, at indsættelsen tager mindre end 10 millisekunder.
Dette viser, at selv efter at File.WriteAllBytes returnerer kontrol til programmet, er det faktisk ikke færdigt med at skrive filen til disken.
Det miljø, jeg kørte på, var linux på en raspberry pi. En skrivehastighedstest bekræfter, at min skrivehastighed til sd-kortet er lidt over 1MB/s, hvilket ville stemme overens med de resultater, jeg ser, 20-30 sekunder at skrive en 30MB-fil, det kunne umuligt gøres på 500ms. at stopur 1 siger, at det var det.
En anden bruger ser ud til at opleve et problem på grund af dette i File.WriteAllBytes gør ikke blokere
Efter at have tilføjet en ekstern SSD USB HDD til raspberry pi'en og skiftet til at gemme filen der i stedet, tager det kun 0,5 sekunder at gemme filen, og problemet forsvinder.