grazie MItaly ho provato e il tuo metodo funziona. ... anche se non ho ben capito perchè ...

comunque io quel codice l'ho messo solo provissoriamente in un timer, in quanto volevo includerlo in un ciclo while solo che, nel timer posso fare con il metodo che tu mi hai descritto, ma in un ciclo while come faccio?

Ti posto il nuovo codice:
codice:
private void riceviDati()
        {
            while (true)
            {
               Application.DoEvents();    <== l'errore è sempre qui  

                int num = 0;
                string command = leggiFlusso.ReadLine();

                if (command.Equals("WALK"))
                {
                    foreach (tassello tas in snake)
                        tas.Location = tas.newPoint;
                }
                else
                {

                    num = int.Parse(command);

                    switch (cont)
                    {
                        case 0:
                            p = new Point();
                            p.X = num;
                            cont++;
                            break;

                        case 1:
                            p.Y = num;
                            cont++;
                            break;

                        case 2:
                            this.pos = num;
                            cont++;
                            break;

                        case 3:
                            if (num <= snake.Count - 1)
                            {
                                if (snake[num].pos != this.pos)
                                {
                                    Bitmap newImg = new Bitmap(img[snake[num].tipo]);
                                    newImg.RotateFlip((RotateFlipType)this.pos);
                                    snake[num].Image = newImg;
                                    snake[num].pos = this.pos;
                                }

                                snake[num].newPoint = p;

                            }
                            else
                            {
                                if (snake.Count <= 2)
                                    this.creaTassello(p, snake.Count);
                                else
                                {
                                    this.creaTassello(p, 2);
                                    snake[snake.Count - 2].Image = img[1];
                                }
                            }

                            cont = 0;
                            break;
                    }
                }
            }
        }
grazie per l'aiuto

luca