Ho un'applicazione che effettua un paio di centinaia di connessioni TCP contemporaneamente e riceve da loro un flusso costante di dati.Sostituzione Socket.ReceiveAsync con NetworkStream.ReadAsync (attendibile)
private void startReceive()
{
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += receiveCompleted;
e.SetBuffer(new byte[1024], 0, 1024);
if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
}
void receiveCompleted(object sender, SocketAsyncEventArgs e)
{
ProcessData(e);
if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
}
I miei tentativi hanno portato a qualcosa di simile:
private async void StartReceive()
{
byte[] Buff = new byte[1024];
int recv = 0;
while (Socket.Connected)
{
recv = await NetworkStream.ReadAsync(Buff, 0, 1024);
ProcessData(Buff,recv);
}
}
Il problema che ho avuto è stato il metodo chiamando StartReceive()
avrebbe bloccato, e non arrivare al accompagna StartSend() method called after
StartReceive() . Creating a new task for
StartReceive() would just end up with 300-ish threads, and it seems to do so just by calling
StartReceive() `comunque.
quale sarebbe il metodo corretto di attuazione delle nuove async
e await
parole sul mio codice esistente mentre si utilizza un NetworkStream
quindi sta usando il pool di thread che Socket.SendAsync()
e Socket.ReceiveAsync()
stanno usando per evitare di dover avere centinaia di fili/compiti?
C'è qualche vantaggio in termini di prestazioni dell'uso di networkstream
in questo modo su porte di completamento di I/O con beginreceive
?
Non è chiaro quale sia il problema o il contesto: parli del metodo di chiamata che blocca ... cosa blocca? Non è questo il problema che devi risolvere? Per favore chiarisci la tua domanda - oltre a indicare se tutto il "lavoro" reale ha un'affinità di thread (ad es. Nel thread dell'interfaccia utente). –
Beh, il problema principale è che la versione che utilizza attendi NetworkStream.ReadAsync fa sì che l'applicazione crei un thread per connessione. Dove l'uso di Socket.ReceiveAsync sembra passare sotto i 30 thread per tutte le 300 connessioni. – Josh