So qualcosa sull'IOCP, ma sono un po 'confuso con APM.in C#, ci sono due thread quando chiamo BeginXXX
static FileStream fs;
static void Main(string[] args)
{
fs = new FileStream(@"c:\bigfile.txt", FileMode.Open);
var buffer = new byte[10000000];
IAsyncResult asyncResult = fs.BeginRead(buffer, 0, 10000000, OnCompletedRead, null);
Console.WriteLine("async...");
int bytesRead = fs.EndRead(asyncResult);
Console.WriteLine("async... over");
}
static void OnCompletedRead(IAsyncResult ar)
{
Console.WriteLine("finished");
}
mi chiedo, è l'azione di lettura eseguita da un filo IO asincrono? O un thread di lavoro in un pool di thread?
E la funzione di richiamata OnCompletedRead
è anch'essa eseguita da un thread IO nel pool di thread CLR?
Questi due fili sono uguali? In caso contrario, vengono generati due thread, uno esegue l'azione di lettura e un altro esegue la richiamata.
Non chiamare "EndReceive" in "Principale". Dovresti invece chiamarlo in "OnCompleteRead" altrimenti non ottieni nessuno dei vantaggi delle chiamate asincrone. –
Mi raccomando anche di leggere http://blog.stephencleary.com/2013/11/there-is-no-thread.html –
Ho letto quel blog. Quindi non c'è thread per elaborare l'azione di lettura. Ma la callback viene eseguita sul thread di I/O, giusto? –