Как я могу запустить эти два метода одновременно C #?

1

Я пытаюсь увеличить эти два изображения на размер, а затем уменьшить размер в то же время, используя два разных метода /while. Как я могу это сделать? Он работает, так как при нажатии кнопки два изображения будут увеличиваться в размере до достижения заданного размера, тогда они будут уменьшаться в размере.

    private void bthGraph_Click(object sender, EventArgs e)
    {
        red();
        blue();
    }

    private void btnReset_Click(object sender, EventArgs e)
    {
        pbxBlue.Width = 10;
        pbxRed.Width = 10;
    }

    public void red()
    {
        int width = 10;
        while (width < 156)
        {
            width++;
            pbxRed.Width = width;
            pbxRed.Refresh();
            Thread.Sleep(10);
        }
        while (width > 10)
        {
            width--;
            pbxRed.Width = width;
            pbxRed.Refresh();
            Thread.Sleep(10);
        }
    }

    private void blue()
    {
        while (pbxBlue.Width < 156)
        {
            pbxBlue.Width++;
            pbxBlue.Refresh();
            Thread.Sleep(10);
        }
        while (pbxBlue.Width > 10)
        {
            pbxBlue.Width--;
            pbxBlue.Refresh();
            Thread.Sleep(10);
        }
    }
}
  • 0
    Рассматривали ли вы вообще переход на WPF? Анимации, которые вы пытаетесь выполнить здесь, намного проще (То, что Thread.Sleep в потоке пользовательского интерфейса является реальным признаком « Thread.Sleep кода»).
  • 0
    Я бы сказал, что это возможно, но добавление WPF усложняет все остальное, а анимация, запуск и тому подобное не так уж и ясны. Если единственная работа для пользовательского интерфейса состоит в том, чтобы сделать это, то это, вероятно, хорошая ставка. Конечно, пользовательский интерфейс, использующий WPF, намного приятнее. Я скучаю по этой полусухой чудовищности.
Теги:

2 ответа

2

попробуйте этот путь

private void bthGraph_Click(object sender, EventArgs e)
{
    Task[] tasks = new Task[]
    {
       new Task(red),
       new Task(blue),
    };

    foreach(var task in tasks)
       task.Start();

    new Task(red).Start();
    new Task(blue).Start();
}
  • 2
    Вы хотите выполнить одно и то же задание дважды? Как насчет доступа к потоку пользовательского интерфейса из потока задач? Я думаю, что это может привести к краху
  • 0
    Если вы используете этот подход, вам придется изменить красный / синий методы, чтобы вызывать операции, которые изменяют размер, что приводит к тому, что все это снова в одном потоке / не одновременно!
0

Каждый элемент управления может быть обновлен только созданным им потоком, который сказал, что вы просто не можете получить доступ к пользовательскому интерфейсу из двух потоков * одновременно, поэтому вы просто не можете достичь того, что вы пытаетесь сделать таким образом. Если вы не создадите анимацию, почему вам нужны два метода?

И вы должны (как уже упоминалось в комментариях) избавиться от "Thread.Sleep" в потоке пользовательского интерфейса, лучше использовать таймер.

* Существует очень грязный способ сделать это, установив свойство CheckForIllegalCrossThreadCalls в false. Но это НИКОГДА не должно быть сделано, поскольку это приводит к неожиданным и неисслеживаемым ошибкам.

  • 0
    @ThorstenDittmar, сериализованный через поток GUI, фактически означает, что вы делегируете операцию потоку пользовательского интерфейса, что означает, что она всегда выполняется в потоке пользовательского интерфейса.
  • 0
    Я перечитал ваш ответ, и хотя он немного вводит в заблуждение, теперь я понимаю, что вы пытаетесь сказать, что только поток пользовательского интерфейса может обновлять пользовательский интерфейс. Это верно. Однако это звучит так, будто никакие два потока не могут указать потоку пользовательского интерфейса выполнить обновление, что неправильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню