Я пытаюсь увеличить эти два изображения на размер, а затем уменьшить размер в то же время, используя два разных метода /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);
}
}
}
попробуйте этот путь
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();
}
Каждый элемент управления может быть обновлен только созданным им потоком, который сказал, что вы просто не можете получить доступ к пользовательскому интерфейсу из двух потоков * одновременно, поэтому вы просто не можете достичь того, что вы пытаетесь сделать таким образом. Если вы не создадите анимацию, почему вам нужны два метода?
И вы должны (как уже упоминалось в комментариях) избавиться от "Thread.Sleep" в потоке пользовательского интерфейса, лучше использовать таймер.
* Существует очень грязный способ сделать это, установив свойство CheckForIllegalCrossThreadCalls в false. Но это НИКОГДА не должно быть сделано, поскольку это приводит к неожиданным и неисслеживаемым ошибкам.
Thread.Sleep
в потоке пользовательского интерфейса является реальным признаком «Thread.Sleep
кода»).