Я не могу запустить свое приложение, потому что у меня есть цикл в моем приложении form_load |windows C#|

У меня проблема в моих руках. У меня есть программа, в которой клиент (form1) должен пытаться переподключиться всякий раз, когда он не может подключиться к серверу. Цикл, в котором я должен выполнить переподключение, находится внутри Fomr_load, так что переподключение происходит автоматически. Но проблема в том, что приложение не открывается до завершения form_load. Кто знает куда я пойду подскажите пожалуйста

 private void Form1_Load(object sender, EventArgs e)
    {
        Client = new TcpClient();
        IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse("192.168.254.38"), 100);
        try
        {
            Socket Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Client.Connect(IP_End);

            if (Client.Connected)
            {
                STW = new StreamWriter(Client.GetStream());
                STR = new StreamReader(Client.GetStream());
                STW.AutoFlush = true;

                backgroundWorker1.RunWorkerAsync();
                backgroundWorker1.WorkerSupportsCancellation = true;
            }
            else
            {
                reconnect();
            }
        }
        catch (SocketException)
        {
            reconnect();
        }
    }  



private void reconnect()
    {
        try
        {
            IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse("192.168.254.38"), 100);
            Client.Connect(IP_End);
            STW = new StreamWriter(Client.GetStream());
            STR = new StreamReader(Client.GetStream());
            STW.AutoFlush = true;

            backgroundWorker1.RunWorkerAsync();
            backgroundWorker1.WorkerSupportsCancellation = true;
        }
        catch (SocketException)
        {
            reconnect();
        }
    }


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

        while (Client.Connected)
        {
            try
            {
                receive = STR.ReadLine();
                label1.Invoke(new MethodInvoker(delegate () { label1.Text = (receive + "\n\r"); }));
                receive = "";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }
    }

1 ответ

Решение

Имейте булеву переменную, которую вы установили в true после успешного подключения, а затем проверьте это также перед вызовом restnect(), чтобы ваш цикл запускался один раз, установите значение connectedSuccessfully = true, затем при следующем запуске он увидит, что оно равно true, и пропустит по вызову для восстановления соединения (). Вы, вероятно, также хотите добавить таймер, чтобы, возможно, повторить попытку через 1 секунду, затем повторить попытку через 5 секунд, затем снова через 10 и т. Д. И т. Д.

Другие вопросы по тегам