2013-04-10 28 views
0

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

我想这会工作

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"); 

       } 

      } 
     } 

但它是一个有点难以预料。 想法?

回答

2

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

您可以移动Invoke之外的所有服务调用,以便它们将在您的线程上执行。

+0

哦,所以将变量中返回的数据从我的服务中传递出来,然后执行trycatch – 2013-04-10 15:29:00

+0

@RhysDrury,yep – alex 2013-04-10 15:31:48

+0

完成工作。谢谢 – 2013-04-10 15:41:37