2014-07-26 2 views
0

그래서 테이블 선택 모듈을 가지고있는이 Windows Form 응용 프로그램을 가지고 적어도 적어도 4 명의 웨이터.함수를 호출하지 않고 백그라운드에서 메서드를 호출하려면 어떻게해야합니까?

표가 설정되면 소프트웨어를 Sync해야합니다. RefreshApp라고하는 내 방법은 적어도 내 필요에 따라 매력처럼 작동합니다. 문제는 그것이 단지 성공적으로 여기에 호출 할 수 있다는 점에서 상주 :

private void loadTables() 
{ 
    // Some load tables code... 

    RefreshApp(); 
} 

여기에 방법을 넣고 그것을 완벽하게 단지 1 시간을 실행 ... 것이 내 문제를 먹으 렴, 나는 그것을 새로 고쳐야 때때로, 그래서 나는 BackgroundWorker에에서 재판 :

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
      while (true) 
      { 
       Thread.Sleep(100); 
      if (_stopwatch.Elapsed >= TimeSpan.FromSeconds(Constants.refreshTime) && Constants.alreadyWorking == false) 
        { 
         Constants.alreadyWorking = true; 
         RefreshApp(); 

         // Restart the stopwatch for next sync event 
         _stopwatch.Restart(); 
        } 
} 

하지만이 코드를 실행하면 내가 대구를 사용하는 경우 I는 "기능 평가가 실행하는 모든 스레드가 필요합니다"얻고, e를 Button_click 메서드로 수동으로 폼에서 테스트하면 같은 오류가 발생합니다.

private void btn_Refresh_Click(object sender, EventArgs e) 
{ 
    RefreshApp(); 
} 

그래서 내 질문은, 어떻게 이런 종류의 오류없이 배경에서 일정 시간에 RefreshApp 메서드를 호출 할 수 있습니까?

private void RefreshApp() 
{ 

    SqlDataReader reader = sqlCommandGetTables.ExecuteReader();   

// foreach PictureBox representation of a table, get db value, compare, assign table state 
       foreach (PictureBox item in from d in group_Layout.Controls.OfType<PictureBox>().Reverse() select d) 
       { 
        if (item.Name == "DMPS_Layout") 
         continue; 

        reader.Read(); 

        //if the item.Text property equals database value [mesa1], assign image 
        if (item.Text == reader.GetSqlValue(1).ToString() && 
         Int32.Parse(reader.GetValue(0).ToString()) == Constants.numMesaEmpty) 
         item.Image = Properties.Resources.mesaEmpty; 

        if (item.Text == reader.GetSqlValue(1).ToString() && 
         Int32.Parse(reader.GetValue(0).ToString()) == Constants.numMesaBusy) 
         item.Image = Properties.Resources.mesaBusy; 

        if (item.Text == reader.GetSqlValue(1).ToString() && 
         Int32.Parse(reader.GetValue(0).ToString()) == Constants.numMesaUnavailable) 
         item.Image = Properties.Resources.mesaUnavailable; 
       } 
    } 
+0

디버깅 할 때와 중단 점에서만 오류 메시지가 표시됩니까? –

+0

예, 실제로 디버깅 할 때만이 오류가 표시되지만 오류가 발생하면 코드가 올바르게 실행되지 않습니다. –

+0

중단 점 **에 있기 때문에 오류가 발생했습니다. 중단 점을 추가 한 증상에 대해 알려주실 수 있습니까? 즉. 이 코드를 디버깅하라는 메시지는 무엇입니까? –

답변

0

내가 오류를 이해하지 않지만, 당신이에서 윈폼 컨트롤에 액세스 안 : 여기

은 (필요에 따라이 방법은 이미 작동하는지 명심) 참조에 대한 코드입니다 메인 (펌프 메시지)과 다른 스레드. Timer (이벤트는 WM_TIMER 메시지를 가져온 후 주 스레드에서 호출 됨)를 사용할 수 있습니다.

MainWork를 제외한 모든 스레드에서 BackgroundWorker에서 RefreshApp을 호출 할 수 없습니다.

참고 : 나는 System.Windows.Forms.Timer (하지 System.Threading.Timer)
비고 2로 다스 려했다 : Control.Invoke() (InvokeRequired, BeginInvoke, EndInvoke)를 사용하여 다른 옵션입니다하지만 스톱워치와 코드를 볼 때 타이머는 이상적이었다 .

+0

사실, 타이머는 주 스레드 부분을 도와주었습니다. 그런 다음 9 시간 후에 코드에 무엇이 잘못되었는지 알아 냈습니다. 다른 '그룹 박스'에 모든 컨트롤을 넣는 방법 이었기 때문에 'group_Layout.Controls.OfType (). 반향()'이 내가 원하는 것을하지 않았습니다. 이 질문으로 무엇을해야합니까? 나는 상당히 새로운 편이다. –

+0

그냥 답을 표시하고 (답이없는 질문을 찾는 사용자를 유치하지 않음) stackoverflow를 완료했습니다. – firda

0

코드를 주 스레드에서 다른 스레드로 옮기기 때문에 이것은 기술적으로 concurrency의 경우가 아닙니다.

this.Invoke(RefreshApp); // `this` being your Form 

나는 당신이 얻을 오류가 여기에 관련이없는,하지만 당신이 너무 고정 된 것을 원한다면 생각 : 그것이 작동되도록하려면 주 스레드에서 RefreshApp 메소드를 호출해야 당신이 중 하나에 조건을 배치 않았다 당신의 beakpoints? 그것이 문제이다.

관련 문제