@itgood

Как правильно Ожидать завершение task wait?

у меня есть асинхронный метод метод который проверяет порт и возвращает результат и есть метод который запускает проверку и там есть условие которое выводит результат когда запускаешь много методов выходит такая вот штука60af576c2ce90914756016.png если метод не успел вернуть статус до запуска новой задачи мы не узнаем результат , как можно это обойти ?
60af5801d52d4084824598.png
private async void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            panel = new StatusPanel();
            ProgressBar = new ProgressBar();
     
            panel.TypePortBlock.Content = ProgressBar;
            PaneStat.Children.Add(panel);
            var obj = (CheckBox)sender;
           
            string[] Ip = obj.Content.ToString().Split(new char[] { '/' });

            panel.Name = RandomString(random.Next(1,30));

            panel.IpaddressBlock.Text = GetIPAddress() ;
            panel.PortBlock.Text = Ip[0];


            ProgressBar.IsIndeterminate = true;
            ProgressBar.Width = 40;
            ProgressBar.Height = 10;
            ProgressBar.Maximum = 100;
            ProgressBar.Minimum = 0;
            
            panel.StatusBlock.Background = Brushes.Orange;
            panel.StatusBlock.Text = "Trying to connect";

            if (await Task.Run(() => StatusPort(int.Parse(Ip[0]))) == true)
            {

                panel.StatusBlock.Background = Brushes.Green;
                panel.StatusBlock.Text = "Enabled";
                ProgressBar.Value = 100;
                ProgressBar.IsIndeterminate = false;
      

            }
            else
            {
                panel.StatusBlock.Background = Brushes.Red;
                panel.StatusBlock.Text = "disabled";
                ProgressBar.Value = 100;
                ProgressBar.IsIndeterminate = false;




            }

        }
        private async Task<bool> StatusPort(int port)
        {
            bool status=false;
            try
            {
                TcpClient t = new TcpClient(AddressFamily.InterNetwork);
             

                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.222.17"), port);
            //   t.SendTimeout = 5;
             
                t.Connect(ipEndPoint);
                status = true;


            }
             catch (SocketException ex)
            {
               
                status =false;
            }

            return status;
        }
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Метод проверки статуса запускается и сразу ставит результат работаю, метод проверки если видит статус работаю засыпает, когда будут данные статус выставляется в готово. Если запускается метод проверки статуса и статус не равен готово то он просто прерывается, ещё нужно добавить проверку на ошибки и тайм-аут
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
Ожидать завершения асинхронного метода в общем не правильно.
Правильнее информирование асинхронным методом об его завершении.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы