尝试执行try catch连续循环,直到服务恢复

本文关键字:服务 恢复 循环 连续 执行 try catch | 更新日期: 2023-09-27 18:08:41

我基本上有一个方法,在不同的线程中不断检查服务。这工作得很好,但我需要做一个检查,以便如果主机关闭,它会继续尝试,直到服务恢复。

我认为这将工作

private void GetTankLevels()
        {
            Service1Client client = new Service1Client();
            while (true)
            {
                try
                {
                    this.DieselBox.Invoke(new MethodInvoker(delegate { DieselBox.Text = client.GetTankAmounts("Diesel").ToString(); }));
                    this.PetrolBox.Invoke(new MethodInvoker(delegate { PetrolBox.Text = client.GetTankAmounts("Unleaded").ToString(); }));
                    double DFuelLvl = client.GetTankAmounts("Diesel");
                    double PFuelLvl = client.GetTankAmounts("Unleaded");
                    int DieselProgress = (int)DFuelLvl;
                    int petrolProgress = (int)PFuelLvl;
                    if (DFuelLvl < 300)
                    {
                        this.DieselBar.Invoke(new MethodInvoker(delegate { DieselBar.Value = DieselProgress; }));
                    }
                    else if (DFuelLvl > 300 && DFuelLvl < 500)
                    {
                        this.DieselBar.Invoke(new MethodInvoker(delegate { DieselBar.Value = DieselProgress; }));
                    }
                    else if (DFuelLvl > 500 && DFuelLvl < 850)
                    {
                        this.DieselBar.Invoke(new MethodInvoker(delegate { DieselBar.Value = DieselProgress; }));
                    }
                    else
                    {
                        this.DieselBar.Invoke(new MethodInvoker(delegate { DieselBar.Value = DieselProgress; }));
                    }
                    if (PFuelLvl < 300)
                    {
                        this.Petrolbar.Invoke(new MethodInvoker(delegate { Petrolbar.Value = petrolProgress; }));
                    }
                    else if (PFuelLvl > 300 && PFuelLvl < 500)
                    {
                        this.Petrolbar.Invoke(new MethodInvoker(delegate { Petrolbar.Value = petrolProgress; }));
                    }
                    else if (PFuelLvl > 500 && PFuelLvl < 850)
                    {
                        this.Petrolbar.Invoke(new MethodInvoker(delegate { Petrolbar.Value = petrolProgress; }));
                    }
                    else
                    {
                        this.Petrolbar.Invoke(new MethodInvoker(delegate { Petrolbar.Value = petrolProgress; }));
                    }
                }
                catch
                {
                    MessageBox.Show("Lost connection to the host... Please wait");
                }
            }
        }

但这有点不可预测。想法吗?

尝试执行try catch连续循环,直到服务恢复

您从Invoke()访问您的服务,因此代码不是在您的线程上执行,而是在主UI线程上执行。当在那里抛出异常时,它不会被try/catch块捕获。

你可以把所有的服务调用移到Invoke之外,这样它们就会在你的线程上执行。