Dopo molti test alla fine ho scoperto che il problema non era affatto nel framework Entity o NpgSql, ma il ritardo che stavo vedendo era causato dalla memorizzazione nella cache di scrittura. Scrivevo sempre un file da 30 MB prima di inserire una riga nella tabella 1 e credevo che la scrittura del file fosse stata eseguita dopo la restituzione di File.WriteAllBytes, quindi non avrebbe avuto alcun impatto su eventuali istruzioni di temporizzazione future. Tuttavia, a livello del sistema operativo, la scrittura su disco non è stata completata quando è stata eseguita l'istruzione insert, causando un ritardo artificiale dell'istruzione insert.
L'ho dimostrato con il seguente codice:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
il cronometro 1 ha mostrato che File.WriteAllBytes impiegava sempre circa 500 ms, quindi il cronometro 2 ha impiegato dai 20 ai 30 secondi circa.
Se cambio MethodThatInsertsIntoTable1 per inserirlo in una tabella diversa, ci vogliono ancora dai 20 ai 30 secondi indipendentemente dalla tabella.
Se aumento Thread.Sleep(1000) a Thread.Sleep(30000), il cronometro 2 registra che l'inserimento impiega meno di 10 millisecondi.
Questo mostra che anche dopo che File.WriteAllBytes ha restituito il controllo al programma, la scrittura del file sul disco non è stata completata.
L'ambiente su cui stavo correndo era Linux su un raspberry pi. Un test della velocità di scrittura conferma che la mia velocità di scrittura sulla scheda SD è di poco superiore a 1 MB/s, il che si allineerebbe con i risultati che sto vedendo, 20-30 secondi per scrivere un file da 30 MB, non è possibile farlo in 500 ms quel cronometro 1 dice che era.
Un altro utente sembra riscontrare un problema a causa di ciò in File.WriteAllBytes fa non bloccare
Dopo aver aggiunto un HDD USB SSD esterno al raspberry pi e aver cambiato per salvare il file lì, il salvataggio del file richiede solo 0,5 secondi e il problema scompare.