[C#] WinForm qui plante à cause d'une boucle

Signaler
-
Bonjour à tous !
Voila je fais mon projet de fin d'étude qui définira si j'ai mon diplôme en info ou pas et j'ai un petit soucis :

Le problème est que j'ai une boucle while (dans mon DoWork) qui fait planter ma winform et la rend donc inutilisable (elle ne répond plus), pour cela je demande votre aide.

Pour les intéressé voici donc mon code (attention pavé en vue) (je précise que le problème se trouve dans la classe Worker) :
using System;
using System.Windows.Forms;
using System.Text;
using System.IO;
using System.IO.Ports;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Threading;
//Librairie Mindsqualls modifiée pour NXT
using NKH.MindSqualls;



namespace NXTlego
{
    public partial class Form1 : Form
    {
        Worker w;

        
        private void Form1_Load(object sender, EventArgs e)
        {
            w = new Worker(this);
            Worker workerObject = new Worker(this);
            Thread workerThread = new Thread(workerObject.DoWork);

            workerThread.Start();

        }



        public Form1()
        {
            InitializeComponent();

        }





        private void button_UltrasonicConnect_Click(object sender, EventArgs e)
        {
            w.ConnexionCapteur();
        }



        public Label strLabelText
        {

            get
            {

                return lbldistance;

            }

        }



        private void button_UltrasonicPollStart_Click(object sender, EventArgs e)
        {

            w.AfficherDistance();

        }



        private void btnConnect_Click(object sender, EventArgs e)
        {

            w.ConnexionBrique();

        }



        private void button_Start_Click(object sender, EventArgs e)
        {

            w.DemarrerMotor();

        }



        private void button_Stop_Click(object sender, EventArgs e)
        {

            w.stop();

        }



    }//end class







    public class Worker
    {

        #region Variables

        NxtBrick brick = null;

        NxtUltrasonicSensor ultrasonicSensor = null;

        byte thePortOut;

        NxtMotor MotorB = new NxtMotor();

        NxtMotor MotorC = new NxtMotor();

        public static bool _ShouldStop = true;

        Form1 m_oMainForm;



        #endregion



        public void DoWork()
        {

            while (!_ShouldStop)
            {

                Avancer();

            }

        }



        public Worker(Form1 mainForm)
        {

            m_oMainForm = mainForm;

        }





        public void Avancer()
        {

            brick.MotorB = new NxtMotor();

            brick.MotorC = new NxtMotor();

            NxtMotorSync motorPair = new NxtMotorSync(brick.MotorB, brick.MotorC);

            motorPair.Run(75, 180, 0);

        }





        public void ConnexionBrique()
        {

            try
            {

                thePortOut = (byte)10;

                brick = new NxtBrick(thePortOut);

                brick.Connect();

            }

            catch
            {

                MessageBox.Show("La brique n'est pas allumée");

            }

        }



        public void ConnexionCapteur()
        {

            if (brick != null && brick.IsConnected)
            {

                try
                {

                    ultrasonicSensor = new NxtUltrasonicSensor();

                    brick.Sensor3 = ultrasonicSensor;

                    ultrasonicSensor.RequestWarmReset();

                    Thread.Sleep(400);

                    string test = ultrasonicSensor.ReadSensorType();

                    Thread.Sleep(400);



                } // end try

                catch
                {

                    ultrasonicSensor = null;

                } // end catch

            } // end else

        }



        public void AfficherDistance()
        {

            if (ultrasonicSensor != null)
            {

                ultrasonicSensor.OnPolled += new Polled(ultrasonicSensor_OnPolled);

                ultrasonicSensor.PollInterval = (double)30 * 10;

            } // end if

        }



        private void ultrasonicSensor_OnPolled(NxtPollable polleditem)
        {

            m_oMainForm.Invoke((MethodInvoker)delegate()
            {

                byte current = ultrasonicSensor.DistanceCm;

                string converted = current.ToString() + " Cm : ";

                m_oMainForm.strLabelText.Text = converted;

            });

        }



        public void DemarrerMotor()
        {

            _ShouldStop = false;

            DoWork();

        }



        public void stop()
        {

            _ShouldStop = true;

        }



    }//end class

}



J’espère avoir quelques solutions et merci d'avance ^^