Отладка странностей с BeginInvoke - PullRequest
1 голос
/ 02 декабря 2010

У меня есть следующий метод:

protected void OnBarcodeScan(BarcodeScannerEventArgs e)
{
    if (BarcodeScan != null)
    {
        //BarcodeScan.BeginInvoke(e, null, null);
        BarcodeScan(e);
    }
}

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

Однако, если я переключаю комментарий (так что BarcodeScan(e) закомментирован и удаляю комментарий на BarcodeScan.BeginInvoke(e, null, null), тогда я не могу перейти ни в одну часть метода OnBarcodeScan (то есть точка останова на if (BarcodeScan != null) делаетне получил удар.

Я тоже пытался поместить туда некоторые отладочные операторы. Но пока там есть вызов start invoke, он не позволяет мне войти в метод.

Я проверилвывод, и когда я пытаюсь войти в него, он говорит следующее:

В ScannerTest.exe произошло первое случайное исключение типа «System.NotSupportedException». Шаг в: Переход по методу без символов Symbol.Marshaller.SymbolMessageWindow.WndProc 'Шаг в: переход по методу без символов' Microsoft.WindowsCE.Forms.MessageWindow._WndProc '

Почему весь метод не может быть выполнен, если в нем есть BeginInvoke?

Любая помощь будет отличной!

1 Ответ

4 голосов
/ 02 декабря 2010

Асинхронные вызовы делегатов (т. Е. BeginInvoke) не поддерживаются в Compact Framework.

Что касается причины, по которой отладчик даже не разбивается на метод, я полагаю, что это связано со следующим:

  • BeginInvoke / EndInvoke методы генерируются компилятором C # (для этого необходимо ), помеченные как «нативные».Это означает, что CLR обеспечит реализацию.
  • Компактная среда CLR не обеспечивает реализацию .
  • Когда JIT-компилятор выполняет метод в первый раз, онищет все методы, которые он может вызвать (загрузка других сборок и т. д.).
  • Поскольку CLR не поддерживает Delegate.BeginInvoke, любой вызывающий его метод не может быть JIT-скомпилирован и, следовательно, не может быть выполнен.
  • NotSupportedException выбрасывается при первом вызове OnBarcodeScan (и JIT-компилятор пытается скомпилировать его и не удается).Вот почему он не может быть использован отладчиком.
...