2017-10-12 53 views
-1

首先,我爲我的英語道歉。每隔一秒檢查我的SQL連接而不凍結

我有一個方法來驗證我的連接到SQL(TestConneccion),並使用計時器來驗證它每一秒。

問題是,當我失去連接時,我的應用程序掛起,而它試圖連接。我正在使用任務來避免這種情況,但我是C#的新手。

我真的很感激幫助

public string testConeccion() 
    { 
     var archivo = ""; 

     try 
     { 
      odb = DatabaseFactory.CreateDatabase("TESTCONECTION"); 
      ocn = odb.CreateConnection(); 

      if (ocn.State == ConnectionState.Closed) 
      { 
       ocn.Open(); 
      } 

      ocn.Close(); 
      archivo = "true"; 
     } 
     catch (InvalidOperationException ex) 
     { 
      archivo = ex.Message; 
     } 
     catch (Exception ex) 
     { 
      archivo = ex.Message; 
     } 
     finally 
     { 
      ocn.Close(); 
     } 

     return archivo; 
    } 

    private void timerMesas_Tick(object sender, EventArgs e) 
    { 
     Task<string> T1 = Task.Run<string>(() => oClasePublica.testConeccion()); 

     if (T1.Result == "true") 
     { 
      btnEstado.Image = new System.Drawing.Bitmap(TOUCHREST.Properties.Resources.Status_32x32); 
     } 
     else 
     { 
      btnEstado.Image = new System.Drawing.Bitmap(TOUCHREST.Properties.Resources.Warning_32x32); 
     } 
    } 
+0

請顯示TestConexion –

+0

的IM代碼,很抱歉,它不是TestConexion,它是TestConeccion()。 –

+0

你似乎缺少'using'語句,因爲我假設你的連接實現了'IDisposable'?此外,你似乎關閉它兩次,(如果連接成功),因爲finally塊將始終執行 – Icepickle

回答

0

讓你的計時器節拍處理asyncawait你的任務。這將異步運行該方法,並防止其他應用程序在運行時掛起。

private async void timerMesas_Tick(object sender, EventArgs e) 
{ 
    string T1 = await Task.Run<string>(() => oClasePublica.testConeccion()); 
    if (T1 == "true") 
    { 
     btnEstado.Image = new System.Drawing.Bitmap(TOUCHREST.Properties.Resources.Status_32x32); 
    } 
    else 
    { 
     btnEstado.Image = new System.Drawing.Bitmap(TOUCHREST.Properties.Resources.Warning_32x32); 
    } 
} 
+0

我仍然有問題,它凍結時,我失去了與SQL連接。 –

+0

這不起作用,因爲它使用await。 Task.Run不應該使用await,而應該有一個'ContinueWith()'來設置圖像。 –

0

try代碼ocn.Close()不需要因爲finally將做到這一點。 catch (InvalidOperationException ex)也不需要,因爲catch (Exception)覆蓋它。

您不能做Task.Run,然後立即測試Result,因爲任務尚未完成!通常你使用Task.Wait();然而,這會阻止你的主線程。

我建議使用BackgroundWorker不斷檢查連接,然後報告進度。這可以避免在非UI線程上更改圖像的問題。

+0

希望你不要介意:) – Icepickle

+0

我會尋求關於BackgroundWorker,thansk很多信息。 –

+0

@RichardSchneider,我被告知使用tcpclient而不是打開和關閉連接,因爲它很貴。 你同意? –

相關問題