Sto lavorando su un'applicazione server client. In determinati momenti, su determinate macchine, quando ci sono più di 5 client che richiedono dati, sembra raggiungere un punto morto. Se passo a eseguire il debug del problema, il programma sembra essere in fase di elaborazione. Semplicemente impostando un punto di interruzione in cui so che il programma è in esecuzione, e facendo in modo che colpisca il punto di interruzione un paio di volte lo fa terminare. Se inserisco Thread.Sleep (0) in determinati punti del codice, principalmente attorno ad alcuni cicli intensivi della cpu, sembra che risolva quasi completamente il problema. L'unico problema che ho ora è che se chiamo Thread.Sleep (0) troppo, può rallentare il codice. Se non lo chiamo abbastanza, il codice sembra essere in stallo. Anche se posso verificare che non è in deadlock perché se inserisco il codice, il problema scompare, semplicemente perché sto mettendo in pausa un thread.Perché Thread.Sleep (0) risolve i miei problemi e come evitarlo?
C'è un buon modo per rintracciare esattamente ciò che sta causando questo. Sembra che accada solo sul mio portatile che esegue Vista, ma non sul mio desktop che esegue Windows XP. Tuttavia, è impossibile eseguire il debug, poiché il semplice passaggio nel codice fa sì che il problema si risolva. Ho letto i commenti che chiamare Thread.Sleep (0) è una cattiva pratica, e non dovrebbe essere necessario, e non mi piace inserire il codice di tipo witchcraft nelle mie applicazioni che non capisco perché debba essere lì . Qualsiasi suggerimento sarebbe molto apprezzato.
[EDIT] Posso anche verificare che il codice è ancora in esecuzione quando è "in stallo", perché se lo lascio abbastanza a lungo, finirà, solo la quantità di tempo necessario è di molti ordini di grandezza superiore. Voglio dire che in realtà è almeno 100 volte più lento quando è in questa modalità "deadlocked". La CPU è ancorata all'80-95%, quindi funziona, anche se ciò che sta facendo è oltre me, perché ci vuole sempre un tempo per completare l'operazione.
[Maggiori informazioni] Solo perché tutti qui insistono sul fatto che si tratta di una situazione di stallo, ho rimosso tutto il codice che ha causato il blocco. C'erano solo un paio di linee di codice che facevano qualsiasi tipo di blocco. I thread funzionano completamente in modo indipendente per la maggior parte, quindi non è stato molto lavoro per rimuovere completamente il blocco. Ancora il problema persiste. Non ci sono più synclock nel mio codice, non più mutex non più roba che vedo vedere che causerebbe un deadlock, ma il problema è ancora lì. E non è bloccato. Funziona, anche se molto lentamente, anche se sta consumando tutte le risorse del processore.
Potresti pubblicare il codice? – Shawn
Scusate, un sacco di codice da pubblicare, e non mi sembra qualcosa che potrei ricreare con un po 'di codice. – Kibbee
La macchina che presenta il problema della mutli-CPU e quella che non ha una CPU singola? Ciò può esporre molti problemi di conflitto di risorse multi-thread. – zdan