2012-06-07 15 views
5

In base al numero di domande, post sul forum, ecc., Sembra che l'implementazione TcpClient/NetworkStream nel BCL non abbia un supporto decente per annullare le operazioni IO. Con l'aggiunta dei metodi Async in .NET 4.5, questa mancanza di cancellazione (o supporto decente di timeout) rende le cose ancora più frustranti dal momento che diventa ancora più complicato (quasi impossibile) cancellare un'operazione che si rifiuta di monitorare il suo CancellationToken durante l'esecuzione di IO .Implementazione .NET TcpClient/NetworkStream che supporta operazioni asincrone e rispetta i timeout

Ho visto molte implementazioni che fanno girare fili aggiuntivi per monitorare l'operazione di rete e chiudere il flusso sottostante se le cose sembrano andare storte. Questo sembra molto sporco in un mondo in cui stiamo cercando di conservare queste risorse utilizzando operazioni asincrone.

Qualcuno può indicarmi una guida per gestire efficacemente l'annullamento/il timeout delle operazioni di I/O di rete verso una robusta implementazione di terze parti che funzioni effettivamente?

risposta

4

L'annullamento dell'IO non è banale. A partire da Vista abbiamo la funzionalità CancelIO, ma questa è una cosa abbastanza nuova ei driver devono supportarlo.

In pratica, il meglio che si può fare è chiudere la presa per cancellare tutto. In alternativa, è possibile implementare una funzione wrapper attorno a un'attività che fornisce il completamento immediato quando viene impostato il parametro CancellationToken. L'operazione di I/O continuerebbe comunque ma il suo risultato verrebbe scartato.

Ecco una discussione approfondita sulla questione: http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

ho pensato CancelIo/CancelIoEx sono stati funzioni a livello del sistema operativo, piuttosto che quelli affidamento sui driver di implementare/li sostengono? – Andrew

+0

Sono API Win32 che chiamano il kernes che chiama il driver. Se si annulla una lettura grande, il driver deve cooperare dicendo al disco di fermarsi. CancelIO ha effetti fisici. – usr

+2

Grazie per avermi spinto in questa direzione. Ho capito che CancelIo/CancelIoEx era a livello di sistema operativo e non richiedeva supporto a livello di driver. Avendo fatto qualche ricerca in più su questo argomento, mi sono imbattuto in questo post (non ho idea di come mi sia perso prima) che discute le sfide dell'annullamento dell'IO asincrono. Sembra che l'IO basato su file sia in linea per ottenere una revisione, ma la rete non lo è. http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew

Problemi correlati