2013-05-18 2 views
2

Я работаю над проектом, который использует API автозаполнения wunderground, и я постоянно сталкиваюсь с очень случайной ошибкой. Код не найден here.Чрезвычайно неопределенное исключение

И исключения, которые я получаю, являются AccessViolationException. Иногда это происходит при вводе текста в текстовое поле.

Exception Информация:

using (XmlReader reader = XmlReader.Create(requestURL)) 

Исключение: Метательное: "Указанный раздел реестра не существует." (System.IO.IOException) Исправлено System.IO.IOException: «Указанный раздел реестра не существует». Время: 2013-05-18 14:55:59 Тема: Основная тема [5672] Исключение: Пойманный: «Указанный раздел реестра не существует». (System.IO.IOException) Исключено событие System.IO.IOException: «Указанный раздел реестра не существует». Время: 2013-05-18 14:55:59 Тема: Основные темы [5672]

Application.Run (новый Form1());

Исключение: Брошено: «Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена». (System.AccessViolationException) Исправлено свойство System.AccessViolationException: «Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена». Время: 2013-05-18 14:55:59 Тема: Основные темы [5672]

Исключение: Метательное: «Попытка чтения или записи в защищенную память Это часто указывает на то, что другая память повреждена.» (System.AccessViolationException) Исправлено свойство System.AccessViolationException: «Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена». Время: 2013-05-18 15:00:01 Тема: Основные темы [4340]

Я пробовал это на 3 разных компьютерах, и через некоторое время .. та же ошибка происходит всегда.

+0

Я понятия не имею, но это может помочь, если вы можете отслеживать и отправлять трассировку стека из исключения. Это пролило бы свет на то, где именно происходит ошибка. –

+3

AccessViolationException в большинстве случаев является ошибкой в ​​неуправляемом компоненте, который вы используете. Иногда эта ошибка возникает из-за того, что вы делаете что-то, что не нравится компоненту, поэтому может возникнуть обходной путь. Лучше всего обратиться в службу поддержки компонентов. –

ответ

0

Я могу воспроизвести AccessViolation в Windows 8. Вам нужно будет включить неуправляемую отладку кода и включить сервер символов, чтобы увидеть причину, нарушитель проблем является обработчиком сообщений AutoComplete, встроенным в Windows. В целом довольно капризный код, он реализуется путем подклассификации элемента управления редактирования для перехвата сообщений. Стек вызовов выглядит следующим образом:

shell32.dll!CAutoComplete::_StartCompletion() + 0x4e bytes 
shell32.dll!CAutoComplete::_OnChar() + 0x7a bytes 
shell32.dll!CAutoComplete::_EditWndProc() - 0x6ae52 bytes 
shell32.dll!CAutoComplete::s_EditWndProc() + 0x23 bytes  
[email protected]() + 0x92 bytes 
[email protected]() + 0xa5 bytes 
[email protected]() + 0x23 bytes 
[email protected]() + 0xbd bytes 
[email protected]() + 0xf8 bytes 
[email protected]() + 0x10 bytes 
[Managed to Native Transition] 
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(System.IntPtr dwComponentID, int reason, int pvLoopData) + 0x24d bytes  
// etc.., not interesting 

Это идет не так, из-за присвоения TextBox.AutoCompleteCustomSource собственности в обработчик события TextChanged. При изменении этого свойства есть побочные эффекты , он заставляет окно управления редактированием воссоздаваться, чтобы новый список автозаполнения стал эффективным. Это очень плохо взаимодействует с кодом подкласса, вероятно, потому, что он все еще использует старый элемент управления редактирования, чье окно было уничтожено или запущено до того, как Winforms получили возможность повторно инициализировать новый элемент управления.

Обходным путем является ожидание установки свойства до завершения обработки события. Это можно сделать элегантно с помощью метода Control.BeginInvoke().Изменение назначения свойств выглядеть следующим образом:

this.BeginInvoke(new Action(() => { 
     textboxInput.AutoCompleteCustomSource = autoComplete; 
    })); 

Теперь окно для текстового поля разрушается и воссоздается позже, принимая жало из уничтожения окна так же, как это перекачивает KeyDown события. Обратите внимание, как эффект от воссоздания окна легко увидеть, текстовое поле мерцает, как дешевый мотель. Я серьезно сомневаюсь, что вы действительно хотите использовать это в программе доставки.

+0

Мои комплименты для вашего проекта pt проекта, вы сделали это легко помочь вам. –

+0

Проект был моим собственным интересом. Я хотел узнать, как использовать внешний API. Я предполагаю, что то, что я хотел сделать с автозаполнением, обычно будет работать только с локальной базой данных SQL или что-то в этом роде. Спасибо, что помогли мне! – user2396344

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