2011-01-20 43 views
1

我寫了一個客戶端 - 服務器C#應用程序,並讓它運行所有的夜晚,當我想看看它是否還在工作我已經找到了服務器上的錯誤。不幸的是,應用程序是大一些的代碼粘貼,但我在說的Program.cs得到一個錯誤的錯誤創建窗口處理

Application.Run(Form1上)

alt text

第一兩個消息框可以忽略(從左到右),因爲它們應該顯示,但另一個

代表buton無法執行

來源於此代碼和MAI此錯誤有一部分(此代碼是在Form1.cs):

public void setButonState(inout_buton b, bool t, int q,int contor) 
     { 
      try 
      { 
       if (b.InvokeRequired) 
       { 
        Callback d = new Callback(setButonState); 
        this.Invoke(d, new object[] { b, t, q, contor }); 
       } 
       else 
       { 
        b.Enabled = t; 
        if (q == 0) b.setBackgroundGrey(); 
        if (q == 1) b.setBackgroundGreen(); 
        if (q == 2) b.setBackgroundRed(); 
        if (q == 3) b.setBackgroundOrange(); 

        b.setSecondaryLabel(contor); 

       } 
      } 
      catch { new ShowMessageBox("FORM1 : delegate buton couldn't be executed"); } 

     } 

我的問題是:在什麼條件下做這些錯誤顯示?

回答

10

與Taskmgr.exe中診斷此,進程選項卡。查看+選擇列並勾選USER對象。在運行時爲您的進程觀察這個值。它應該穩步攀升。當它達到10,000時,你的程序將會受到這個異常的影響。

這是由於您無法通過調用Remove()或Clear()從您從Controls集合中自己刪除的控件調用Dispose()而導致的。

+0

所以,如果我想用Dispose()方法,將工作?以及我如何擴展這個10000限制? – Alex 2011-01-21 14:28:39

1

的聲音,我喜歡你的應用程序試圖訪問受保護的數據。請記住,當由於不活動你的系統鎖定/註銷,應用程序將無法與系統的某些方面的互動。這樣的例子就是試圖抓住一個窗口的句柄或者拍攝一個屏幕截圖。這些都會拋出錯誤。

1

從foreach語句內調用靜態類方法時,我收到了同樣的錯誤。用戶對象計數繼續增加,直到程序結束或發生錯誤時才釋放。

我改變靜態方法爲實例方法和用戶對象維持在60

//創建和對象 VAR OIP的實例=新ImportProvider();

foreach(lstPatients中的var患者) var oP = PatientConversionProvider.GetPatient(oPatient.RecordId);

if(oP != null) 
{ 

    //referenced the instance member (changed from a static member) 
    if(oIP.ImportDataIntoSmartRx(oP)) 
    { 
     successCount++; 
     lstMrNumber.Add(oPatient.MrNumber); 
    } 

    totalCount++; 

...