Domanda

Ho un pezzo di codice (su un server) che utilizza asincroni metodo per ricevere i dati sui socket come questo:

asyncRes = connectionSocket.BeginReceive(receiveBuffer, 0, RECEIVING_BUFFER_SIZE,
    SocketFlags.None, out error, new AsyncCallback(ReceiveDataDone), null);

Nel gestore (ReceiveDataDone) della presa ci sono casi in cui Thread.Sleep (X) viene utilizzato al fine di aspettare per altre cose (attuazione discutibile in effetti). So che questo è un disegno discutibile ma mi chiedo se fare questo tipo di codice potrebbe spiegare un'esplosione di thread creati nella mia applicazione a causa delle altre prese in sospeso nel server che hanno le loro ReceiveDataDone chiamato. (Quando molte connessioni sono gestite dal server il numero di thread creato esplode figurato). Mi chiedo come metodo BeginReceive sul lavoro .NET socket, che potrebbe spiegare l'enorme numero di thread che vedo.

È stato utile?

Soluzione

È assolutamente non dovrebbe eseguire qualsiasi tipo di azione di blocco in callback APM. Questi vengono eseguiti in ThreadPool. Il ThreadPool è stato progettato per l'invocazione di attività di breve durata. Se si blocca (o prendere un lungo periodo di tempo per l'esecuzione) si sta legando (un numero finito di) fili e causando ThreadPool fame. Perché il ThreadPool non ruota fino discussioni in più facilmente (in realtà, è abbastanza lento per iniziare le discussioni in più), si sta strozzature sui tempi che i controlli quanto velocemente è consentito il ThreadPool a girare nuove discussioni.

Nonostante rispondendo a una domanda diversa, questa risposta mi ha fornito un po 'indietro, spiega lo stesso problema:

https://stackoverflow.com/a/1733226/14357

Altri suggerimenti

Non dovrebbe usare Thread.sleep per l'attesa in ThreadPool Fili questo fa sì che la discussione ad essere bloccato e non accetterà ulteriori elementi di lavoro per il tempo che è bloccato.

È possibile utilizzare TimerCallback per tale uso di un Astuccio. Si farà si che il programma ThreadPool altri lavori sulla filettatura attesa nel frattempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top