Не работает многопоточность C#

Методы по отдельности работают, но когда хочу выполнить их с помощь многопоточности ничего не происходит.

private void buttonFly_Click(object sender, EventArgs e)
        {
            Operator operator1 = new Operator(pictureBoxQuad1, pictureBoxMehan1, this.Width, this.Height);
            Operator operator2 = new Operator(pictureBoxQuad2, pictureBoxMeh2, this.Width, this.Height);
            Thread myThread1 = new Thread(operator1.StartFly);
            Thread myThread2 = new Thread(operator2.StartFly);
            myThread1.Start();
            myThread2.Start();
        }

public class Operator
    {
        System.Windows.Forms.Timer timer;
        Quadrocopter Quadrocopter;
        Mehanic1 Mehanic;
        PictureBox PictureBoxQuad;
        PictureBox PictureBoxMehan;

        public  Operator (PictureBox PictureBoxQuad, PictureBox PictureBoxMehan, int Width, int Height)
        {
            this.PictureBoxQuad = PictureBoxQuad;
            this.PictureBoxMehan = PictureBoxMehan;
            Quadrocopter = new Quadrocopter(Width, Height, PictureBoxQuad.Width, PictureBoxQuad.Height, PictureBoxQuad.Location); ;
            Mehanic = new Mehanic1();
            Quadrocopter.NotifyToFix += Mehanic.GoToFix;

            timer = new System.Windows.Forms.Timer();
            timer.Tick += MoveQuadrocopter;
        }

        public void StartFly()
        {
            timer.Start();
            Thread.Sleep(300);
        }

        void MoveQuadrocopter(Object sender, EventArgs e)
        {
            if (!Quadrocopter.IsQuadracFault)
            {
                timer.Interval = 100;
                PictureBoxQuad.Location = Quadrocopter.Execute();
            }
            else
            {
                timer.Interval = 1000;
                PictureBoxMehan.Location = Quadrocopter.Execute();
            }
        }
    }

Ответы (1 шт):

Автор решения: aepot

Вы не можете взаимодействовать с интерфейсом из стороннего потока. Точнее, как вы уже поняли, можете, но так работать не будет.

А вот так будет:

private void buttonFly_Click(object sender, EventArgs e)
{
    Operator operator1 = new Operator(pictureBoxQuad1, pictureBoxMehan1, this.Width, this.Height, this);
    Operator operator2 = new Operator(pictureBoxQuad2, pictureBoxMeh2, this.Width, this.Height, this);
    // ... ваш код
}
public class Operator
{
    // ...ваш код
    Form form;

    public Operator (PictureBox PictureBoxQuad, PictureBox PictureBoxMehan, int Width, int Height, Form form)
    {
        this.form = form;
        // ...
    }

    // ...
    void MoveQuadrocopter(Object sender, EventArgs e)
    {
        if (!Quadrocopter.IsQuadracFault)
        {
            timer.Interval = 100;
            Point location = Quadrocopter.Execute();
            form.Invoke((Action)(() => PictureBoxQuad.Location = location));
        }
        else
        {
            timer.Interval = 1000;
            Point location = Quadrocopter.Execute();
            form.Invoke((Action)(() => PictureBoxMehan.Location = location));     
        }
    }
}

Form.Invoke() перенаправляет вызов в UI поток формы.

Еще я не уверен, будет ли System.Windows.Forms.Timer работать в многопоточной среде, если не будет, напишите, придумаем что-нибудь, есть и другие таймеры, и способы реализовать это без таймеров. Но чтобы понять, как правильно реализовать, надо выяснить, что там внутри у Quadrocopter.Execute().

→ Ссылка