2015-04-02 13 views
5

Sto utilizzando il seguente codice C# per leggere un file di testo molto piccolo su una condivisione di rete:OpenRead asincrono

string fileContent; 
using (var stream = File.OpenRead(filePath)) 
using (var reader = new StreamReader(stream, FileEncoding)) 
{ 
    fileContent = await reader.ReadToEndAsync(); 
} 

Anche se il file di testo è molto piccolo (meno di 10 KB) questa operazione a volte prende ~ 7 secondi per correre. Quando ciò accade, ho notato la maggior parte del tempo viene speso per

File.OpenRead(filePath) 

Ciò è probabilmente dovuto a Windows dover risolvere la condivisione di file e di acquisire le serrature sul file attraverso la rete. Poiché la chiamata al metodo non è asincrona, questo sta bloccando il thread corrente per diversi secondi.

C'è un modo sicuro di leggere un file dal disco in modo asincrono che esegue anche OpenRead in modo asincrono?

+0

Hai provato a copiare o spostare il file in locale prima e poi a leggerlo? Provalo solo se non lo hai già provato, questo potrebbe mostrare altri possibili problemi in rete, se così fosse. –

risposta

8

No, sfortunatamente questo manca nell'API Win32. I driver di dispositivo hanno la nozione di "apertura asincrona", quindi l'infrastruttura è lì; ma l'API Win32 non espone questa funzionalità.

Naturalmente, ciò significa che .NET non può esporre tale funzionalità. Tuttavia, è possibile utilizzare un'operazione "falso asincrono", ad esempio, avvolgere il file letto in uno Task.Run, in modo che il thread dell'interfaccia utente non sia bloccato. Tuttavia, se si utilizza ASP.NET, non utilizzare Task.Run; basta tenere aperto il file (di blocco) così com'è.

+0

SANTO CRAP. C'è una voce per ottenere quella aggiunta all'API di Win 10? – Aron

+0

Non sono su ASP.NET, ma sarei interessato a sapere perché sarebbe una scelta sbagliata in particolare. Eventuali riferimenti? – roim

+0

@aron: non a mia conoscenza; sentiti libero di aprire un problema UserVoice. Credo che anche la chiusura asincrona sia possibile, ma potrebbe essere più difficile da modellare. –