2011-01-20 8 views
1

Я написал приложение для клиентского сервера C# и позволю ему работать всю ночь, а когда я хочу посмотреть, все еще работает, я обнаружил ошибку на сервере. к сожалению, приложение является большим, чтобы вставить в какой-то код, но я получаю сообщение об ошибке приОшибка Создание дескриптора окна

Application.Run (Form1)

в Program.cs, что говорит alt text

Первый два MessageBoxes можно пренебречь (слева направо), потому что они должны показать, а другой

делегат бутон не может быть выполнена

приходит от этого кода и Маи есть часть в этой ошибке (этот код в 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, вкладка Processes. Открыть + Выбрать столбцы и пометить объекты USER. Соблюдайте это значение для своего процесса во время его запуска. Он должен неуклонно подниматься. Когда он достигнет 10 000, ваша программа будет бомбить с этим исключением.

Это связано с тем, что вы не вызываете Dispose() на элементах управления, которые вы сами удаляете из коллекции Controls, либо вызывая Remove(), либо Clear().

+0

так, если я хотел бы использовать метод Dispose() он будет работать? и как я могу расширить этот предел 10000? – Alex

+0

Исправьте ошибку в коде, не ищите обходной путь, который приведет к сбою вашей программы позже. Десять тысяч окон - безумно большое количество окон. Несколько дюжин - это нормально. Счетчик объектов USER - отличная диагностика. –

+0

если я вызову периодичность GC.Collect(), это поможет? – Alex

1

Звучит так, как будто ваше приложение пытается получить доступ к защищенным данным. Имейте в виду, что когда ваша система блокируется из-за неактивности/выхода из системы, ваше приложение не сможет взаимодействовать с определенными аспектами системы. Такой пример будет пытаться захватить ручку окна или сделать снимок экрана. Это вызовет ошибки.

1

Я получал эту же ошибку при вызове метода статических классов из инструкции foreach. Счет объектов пользователя продолжал увеличиваться и не был выпущен до завершения программы или возникновения ошибки.

Я изменил статический метод в метод экземпляра и пользовательский объект остался на 60.

// создается и экземпляр объекта вар ОИС = новый ImportProvider();

Еогеасп (вар пациента в lstPatients) { вар 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++; 

...

Смежные вопросы