2010-07-03 10 views
6

OK, a quanto ho capito, .NET Threadpool conserva un numero di thread in background pronti per essere utilizzati per attività di qualche tipo.Thread di lavoro Threadpool .NET e thread di I/O asincroni

I metodi Get/SetMinThreads e Get/SetMaxThreads contengono due parametri che possono essere restituiti o regolati.

In base a MSDN i due parametri indicano il numero di thread di lavoro e il numero di thread utilizzati per operazioni di I/O asincrone.

Che tipo di operazioni utilizzano questi specifici tipi di filo?

thread di lavoro:

  1. QueueUserWorkItem presumo.
  2. C'è altro?

IO asincrono discussioni:

  1. usata chiamando BeginXXX, Endxxx su flussi di file per esempio? (O rete, porta seriale, ecc.)
  2. C'è altro?

Grazie per qualsiasi chiarimento, o un buon collegamento sull'argomento.

risposta

6

Sì, QUWI ma anche il metodo BeginInvoke() di un tipo delegato. E utilizzato da poche classi, BackgroundWorker è l'esempio più noto. Che sotto la cappa utilizza semplicemente BeginInvoke() del delegato.

I thread di completamento I/O sono una funzionalità di Windows di livello molto basso che consente di eseguire rapidamente il codice quando viene completata una richiesta di I/O. Più visibile dall'ultimo argomento della funzione ReadFileEx(), ce ne sono altri. L'equivalente gestito viene esposto tramite ThreadPool.BindHandle().

È compito delle classi .NET ottenerlo correttamente. Alcuni lo usano: FileStream, PipeStream, FileSystemWatcher, Socket, il thread di lavoro interno di SerialPort e alcune classi di supporto del canale WCF.

Personalmente non sono un grande fan di ottenere questi dettagli di configurazione esposti nell'API, in particolare quelli del thread di completamento dell'I/O. È un po 'fuori discussione dal team BCL, alcuni FUD sulla loro fine. Queste impostazioni influenzano l'intero programma, i valori predefiniti sono già abbastanza generosi. Armeggiare con loro equivale approssimativamente a chiamare GC.Collect(). Se riuscirai a trovare una buona ragione per cambiarli, è meglio se sei bloccato in un buco infernale con solo un'ora di tempo per riprendere l'aereo a casa. Ci sono stato :)

+0

Sir sono una guida un po 'confusa. Se utilizziamo i delegati BeginInvoke e EndInvoke anziché QUWI, il nuovo thread creato per eseguire l'operazione asincrona -> "Questo nuovo thread è stato preso dal ThreadPool ??". E sarà WorkerThread o Async I/O Thread del ThreadPool. – Dinesh

+2

Sì, thread del threadpool, come per QUWI. Un thread di lavoro, i thread I/O vengono utilizzati solo dalle routine di completamento I/O (metodo BindHandle()). –

+0

Grazie signore :) – Dinesh