2014-09-01 4 views
0

많은 장소를 살펴 보았지만 해결 방법을 찾지 못했습니다. 내가 성취하고자하는 것은 시간에 맞춰 BackgroundWorker를 사용할 수 있다는 것입니다. 여기에서 일어나고있는 것은 isOnline 방법 검사가 데이터베이스 (단지 예) 8 초마다에 연결하고 그에 따라 텍스트를 변경하는 경우이다타이머가있는 Backgroundworker 사용

public Main() 
    { 

     isDbAvail = new BackgroundWorker(); 
     isDbAvail.DoWork += isOnline; 
     isDbAvail.RunWorkerCompleted += rewriteOnlineStatus; 


    } 

    private void rewriteOnlineStatus(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Subs.Connection connection = new Subs.Connection(); 
     changeStatus(connection.isDbAvail()); 
    } 

    private void isOnline(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      Console.WriteLine("Checking database connection"); 
      System.Threading.Thread.Sleep(8000); 
     } 
    } 

    public void changeStatus(bool status) 
    { 
     if (status) 
     { 
      serverStatusVal.Text = "Connected"; 
      serverStatusVal.ForeColor = System.Drawing.Color.DarkGreen; 
     } 
     else 
     { 
      serverStatusVal.Text = "Not connected"; 
      serverStatusVal.ForeColor = System.Drawing.Color.Red; 
     } 
    } 

예를 들면 다음과 같습니다이다. 내가 알아 차 렸지만, isOnline 메서드 내의 while 루프는 무기한으로 실행되기 때문에 절대 실행하지 않는 rewriteOnlineStatus 메서드를 발생시킵니다. 이 다른 해결 방법이 있습니까?

+0

'BackgroundWorker.ReportProgress' 체크 아웃 – Blorgbeard

+1

8 초마다 실행되는 '타이머'를 사용하지 않는 이유는 무엇입니까? –

+0

@yuval, 연결이 끊어지면 시간이 초과 될 때까지 데이터베이스 연결을 확인하지 않으므로 차단됩니다. – Blorgbeard

답변

1

BackgroundWorker.ReportProgress을 사용하고 백그라운드 스레드에서 연결을 확인하는 것이 좋습니다. 이 같은

뭔가 :

public Main() 
{ 
    isDbAvail = new BackgroundWorker(); 
    isDbAvail.WorkerReportsProgress = true; 
    isDbAvail.DoWork += isOnline; 
    isDbAvail.ProgressChanged += rewriteOnlineStatus; 
    isDbAvail.RunWorkerAsync(); 
} 

private void rewriteOnlineStatus(object sender, ProgressChangedEventArgs e) 
{   
    changeStatus((bool)e.UserState); 
} 

private void isOnline(object sender, DoWorkEventArgs e) 
{ 
    while (true) 
    { 
     Console.WriteLine("Checking database connection"); 
     Subs.Connection connection = new Subs.Connection(); 
     isDbAvail.ReportProgress(0, connection.isDbAvail); 
     System.Threading.Thread.Sleep(8000); 
    } 
} 

이제 BackgroundWorker에이 일을하고 있으며, ProgressChanged를 통해 다시 UI 스레드에보고.

+0

예, 0을 전달하고 무시합니다. 결과는 UserData 객체에 전달됩니다. 이것은 과부하입니다. http://msdn.microsoft.com/en-us/library/a3zbdb1t.aspx – Blorgbeard

+0

이것은 매력처럼 작동했습니다. 고맙습니다! – Dimitri

+1

좋습니다! 한 가지 더 :'Subs.Connection'이'IDisposable'을 구현한다면, 그것을 사용하는 코드를'using' 문으로 감싸 야합니다. 그렇지 않으면 8 초마다 새 연결을 만들기 때문에 잠시 후 문제가 발생할 수 있습니다. – Blorgbeard