Помогите исправить баг

Есть такой код:

private async void Form1_Load(object sender, EventArgs e)
{
progressBarStatus.Value = 0;
await Task.Delay(500);
progressBarStatus.Value = 20;
await Task.Delay(1500);
progressBarStatus.Value = 50;
await Task.Delay(2500);
progressBarStatus.Value = 50;
var mainForm = new MainForm();
await Task.Delay(500);
progressBarStatus.Value = 100;
await Task.Delay(500);
this.Hide();
mainForm.ShowDialog();
this.Close();
}

произошол баг что открываются 2 формы вместо 1помогите пожалуйста.

Наверно дело не в этом коде, у меня одна открывается.

WindowsFormsApp6.zip (12.1 КБ)

1 лайк

спасибо за ответ! щас попробую проверить код

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

        private async void loader_Load(object sender, EventArgs e)
        {
            SetLabelStatusText("загружаем формы!");
            bunifuProgressBar1.Value = 0;
            await Task.Delay(2500);
            SetLabelStatusText("делаем фикс!");
            bunifuProgressBar1.Value = 20;
            if (System.IO.File.Exists("moo.dll"))
                System.IO.File.Delete("moo.dll");
            await Task.Delay(1000);
            bunifuProgressBar1.Value = 50;
            SetLabelStatusText("проверяю обновления!");
            string address = "https://pastebin.com/raw/hu3qr5d4";
            try
            {
                WebClient webClient = new WebClient();
                string text3 = webClient.DownloadString(address);
                File.WriteAllText("version.DontDelete", text3);
                StreamReader streamReader = new StreamReader("version.DontDelete");
                string b = streamReader.ReadLine();
                streamReader.Close();
                string a = webClient.DownloadString(address);
                if (a != b)
                {
                    MessageBox.Show("обаружено обновление!!! для того чтобы обновитя откройте бустапер!!!", "REx оповещение");
                }
                else
                {
                    SetLabelStatusText1("обновления не обноружены");
                }
            }
            catch
            {
                SetLabelStatusText1("необнаружен файл проверки");
            }
            await Task.Delay(2500);
            SetLabelStatusText("готовимся!");
            bunifuProgressBar1.Value = 50;
            var mainForm = new key_system();
            await Task.Delay(500);
            SetLabelStatusText("запускаю!");
            bunifuProgressBar1.Value = 100;
            await Task.Delay(500);
            this.Hide();
            mainForm.ShowDialog();
            this.Close();

        }
  public void SetLabelStatusText(string value) => Invoke(((Action<string>)((e) => label3.Text = e)), new object[] { value });
        public void SetLabelStatusText1(string value) => Invoke(((Action<string>)((e) => label5.Text = e)), new object[] { value });

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

Или

using System.Diagnostics;

...

Debug.WriteLine(new StackTrace().ToString());

и смотреть вкладку Output.

а почему у точки остоновы ошибка какаято (если тупые вопросы то простите я просто новичок в .net)
Screenshot_18

Так а что написано при наведении?)

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

image

простите забыл дебагвключить)


вот что он мне написал

Ну так и смотрите откуда сюда попали в первый и второй раз )

мне люди с других форумах посоветовали сделать так

        private async void loader_Load(object sender, EventArgs e)
        {
            label3.Text = "Ожидание...";

            bunifuProgressBar1.Value = 15;

            await Task.Delay(2500); // просто ожидаем 2500 мс

            label3.Text = "делаем фикс";
            await Task.Factory.StartNew(() =>
            {
                if (File.Exists("mydll.dll")) File.Delete("mydll.dll");
            }); //ожидаем до тех пор пока не удалится файл...

            bunifuProgressBar1.Value = 25;

            await Task.Delay(1250); // просто ожидаем 1250 мс

            bunifuProgressBar1.Value = 40;

            label3.Text = "Проверяем обновления...";

            await Task.Factory.StartNew(() =>
            {
                string address = "https://pastebin.com/raw/hu3qr5d4";
                try
                {
                    WebClient webClient = new WebClient();
                    string text3 = webClient.DownloadString(address);
                    File.WriteAllText("version.DontDelete", text3);
                    StreamReader streamReader = new StreamReader("version.DontDelete");
                    string b = streamReader.ReadLine();
                    streamReader.Close();
                    string a = webClient.DownloadString(address);
                    if (a != b)
                    {
                        MessageBox.Show("обаружено обновление!!! для того чтобы обновитя откройте бустапер!!!", "REx оповещение");
                    }
                    else
                    {
                        SetLabelStatusText1("обновления не обноружены");
                    }
                }
                catch
                {
                    SetLabelStatusText1("необнаружен файл проверки");
                }
            });

            await Task.Delay(2000); // просто ожидаем 2000 мс

            bunifuProgressBar1.Value = 60;

            label3.Text = "Готовимся...";

            await Task.Delay(2000); // просто ожидаем 2000 мс

            label3.Text = "Загрузка формы...";

            key_system form1 = await Task.Factory.StartNew(() => new key_system());

            await Task.Delay(2000); // просто ожидаем 2000 мс

            bunifuProgressBar1.Value = 80;

            label3.Text = "Готово";
            await Task.Delay(1000); // просто ожидаем 2000 мс
            bunifuProgressBar1.Value = 100;


            this.Hide();

            form1.ShowDialog();

            this.Close();

        }

но появилась новая проблема
Screenshot_21 Screenshot_22
мне кажется виновата эта часть кода
key_system form1 = await Task.Factory.StartNew(() => new key_system());

Так посмотрите откуда вы попадаете на открытие формы во второй раз, зачем гадать?

Это скорее всего плохая идея, с UI надо работать из основного потока.
И непонятно в чем смысл этого изменения.

там это не написано

там он ссылается только на строчку кода которая включает эту форму, и все!

Не написано что? Stack trace именно это и показывает.

Если оба раза создание происходит отсюда

то надо смотреть ниже как попали сюда и т.д.

у меня сразу 2 формы открываются

Дык хоть 3, смотрите откуда вызов открытия формы произошел в первый и во второй раз.

@AlexP посмотрел, оказывается вызов дублируется тобиш 2 форма открывается от form1.ShowDialog(); от которого открылась и 1 форма

интересно почему

@AlexP ну так что есть идеи?