Как открыть form2 из form1 (из асинхронной задачи)

#c# #forms

#c# #формы

Вопрос:

Я пытаюсь открыть form2 из асинхронной задачи в form1. Когда я пытаюсь открыть его с помощью:

 public void DoWorkPollingTask()
{
    Form f2 = new Form2();
    Task.Run(async () =>
            {
                while (true)
                {
                    f2.Show();

                    await Task.Delay(10000);
                }
            });
}
  

это показывает мне это:
введите описание изображения здесь

Пожалуйста, не смущайтесь этой ошибкой подключения к Интернету. Это не фактическое всплывающее окно из Visual Studio, это просто мой form2, но проблема в том, что он загружен не полностью, как вы можете видеть на этом изображении. Это должно выглядеть так: введите описание изображения здесь

Есть ли какой-либо способ показать form2 из задачи таймера задачи, которая выполняется каждые x секунд?

Комментарии:

1. Код: hastebin.com/ehulavotoj.cs

2. Скорее используйте модальную форму: f2.ShowDialog() без какой-либо задачи.

3. @OpenSource, можете ли вы объяснить, почему вы используете while(true) и Task . Задержка из-за того, что она изменяет ваш пользовательский интерфейс, для меня это не имеет смысла.

4. @sayahimad Почему вы думаете, что это заморозит пользовательский интерфейс?

Ответ №1:

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

Просто не используйте поток пула потоков, так как здесь вообще нет причин для этого.

 public async void DoWorkPollingTask()
{
    Form f2 = new Form2();
    while (true)
    {
        f2.Show();

        await Task.Delay(10000);
    }
}
  

Есть ли какой-либо способ показать form2 из задачи таймера задачи, которая выполняется каждые x секунд?

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