2014-07-26 22 views
0

因此,我有一個餐廳的Windows窗體應用程序,我有一個表選擇模塊,它至少會被使用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(); 
        } 
} 

但是,如果我運行的代碼在那裏我得到「的功能評價,需要所有的線程來運行」,如果我用的是鱈魚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

我不明白的錯誤,但你不應該訪問的WinForms控制與主要不同的線程(泵送消息)。你可以使用Timer(事件在獲得WM_TIMER消息後會在主線程中調用)。

你根本無法從BackgroundWorker調用RefreshApp(在除main之外的任何線程上)。

注:我指的System.Windows.Forms.Timer(不System.Threading.Timer
NOTE2:使用Control.Invoke()(InvokeRequired,BeginInvoke的,EndInvoke會)是另一種選擇,但是當我看到秒錶計時器代碼是非常理想的。

+0

實際上,Timer DID幫助我處理主線程部分,然後9小時後,我發現我的代碼出了什麼問題;這是一種將所有控件放在另一個「groupbox」上的方法,這就是爲什麼'group_Layout.Controls.OfType ().Reverse()'沒有做到我想要的。我該怎麼處理這個問題?對於我來說,我很新。 –

+0

只是將一些答案標記爲已接受(不吸引那些搜索尚未回答的問題的人),並且您已完成了計算器。 – firda

0

這在技術上不是concurrency的情況,因爲您只是將代碼從主線程移至另一個線程。要使其工作,你應該調用在主線程的RefreshApp方法:

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

我覺得你得到的錯誤在這裏無關緊要,但如果你想要的是固定的太大:你放置一個條件上的一個你beakpoints?那就是問題所在。

相關問題