Async
вариант того же процесса, чтобы проверить что-то другое.
(Основная причина того, что ваш поток не работал должным образом, уже была объяснена. Если вы используете поток и затем вызываете поток пользовательского интерфейса в замкнутом цикле, это более или менее похоже на то, что ваш код не запускается в другом потоке в все: форма не успевает обновить себя или свои элементы управления).
Этот метод добавляет завершение в процедуру прокрутки, когда форма прокручивается за пределами текущих границ экрана. Когда это условие выполнено, цикл while завершается, и задача завершается, перемещая форму в центре экрана.
Задание запускается в событии Shown
. Я думаю, что это более уместно, чем событие Load
(форма готова для представления здесь).
Обратите внимание, что ни эта Задача, ни Поток не добавляют никакой проверки на событие Form.FormClosing
, чтобы отменить асинхронный процесс. Если форма будет закрыта во время прокрутки, у вас, скорее всего, будет исключение (форма была удалена, поэтому больше не обрабатывать).
private async Task Scroller(int ScreenWidth)
{
int x = 0;
int MoveRate = 2;
while (true)
{
x += MoveRate;
this.BeginInvoke(new MethodInvoker(() => { this.Location = new Point(x, 150);}));
await Task.Delay(10);
if (x > ScreenWidth) break;
}
};
}
private async void MyAppMainForm_Shown(object sender, EventArgs e)
{
int ScreenWidth = Screen.FromHandle(this.Handle).Bounds.Width;
await this.Scroller(ScreenWidth);
this.Location = new Point((ScreenWidth - this.Width) / 2 , 150);
}