2017-10-12 7 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

のコードを表示してください。申し訳ありませんが、TestConexionではなく、TestConeccion()です。 –

+0

あなたは 'using'ステートメントが見つからないようです。なぜなら、あなたの接続が' IDisposable'を実装していると思いますか?また、finallyブロックが常に実行されるので、2回閉じているように見えます(接続が成功した場合) – 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

finallyはそれを行いますので、tryコードでocn.Close()が必要とされていません。また、catch (Exception)がそれをカバーするので、catch (InvalidOperationException ex)は不要です。

Task.Runは実行できません。タスクがまだ完了していないため、すぐにResultをテストしてください。通常はTask.Wait()を使用します。しかし、これはあなたのメインスレッドをブロックします。

接続を継続して確認して、進行状況を報告するBackgroundWorkerを使用することをおすすめします。これにより、UI以外のスレッドでイメージを変更する問題が回避されます。

+0

あなたは気にしないでくださいね:) – Icepickle

+0

私はBackgroundWorkerに関する情報をたくさん探します。 –

+0

@RichardSchneider、私は高価なので、tcpclientを使用し、接続を開いたり閉じたりしないように指示されています。 あなたは同意しますか? –

関連する問題