2013-03-18 2 views
1

Я знаю, что есть ошибка с .Net 2.0 с LCG, которая генерирует AccessViolationException, когда используются определенные IEnumerable<> и другие подобные объекты; и что есть исправление.AccessViolationException при взаимодействии с RichTextBox

У меня есть проект в .Net 4.0 с использованием WinForms, работающего под Windows 7 x64. У меня очень простая форма - ничего, кроме формы, и RichTextBox состыковался, чтобы охватить весь размер клиента.

Из фонового потока, я периодически вызывать метод обновления на моей форме, что делает что-то похожее на следующее:

public static void Log(string text) 
{ 
    Invoke((MethodInvoker)(() => { 
    lock(richTextBox) { 
     richTextBox.Text += text; 
    } 
    })); 
} 

Я на самом деле есть и внутренность invoke и снаружи в try/catch (Да, я знаю, это ужасно!), и я делаю некоторые дополнительные вещи, такие как перенос каретки в конец и прокрутка к ней. Я также использую StringBuilder но все это рядом с точкой:

Редко, но неизбежно, в то время отладки, мой IDE обнаруживает AccessViolationException где-то в коде, который обновляя текстовое поле. Иногда в бит, который обновляет текст, иногда на бит, который делает выбор, и иногда на бит, который прокручивается до каретки. Если я нажму F5, чтобы продолжить, я обычно не вижу проблемы в течение некоторого времени, и приложение продолжается по-прежнему.

С этим текстовым полем ничего не происходит. Нет состояния гонки (прежде всего потому, что у меня есть блокировка), но также и потому, что в моем коде просто нет ничего, что пыталось бы написать и написать в текстовое поле одновременно с чем-то другим.

Любая идея, почему это может произойти? Извините, я не знаю, какую другую информацию я могу здесь поместить, поскольку я даже не знаю, почему это происходит в первую очередь.

ответ

0

Не уверен, что делает остальная часть вашего кода, но я считаю, что проблема связана с блокировкой (richTextBox). Если поток GUI что-то делает с RichTextBox, блокировка не будет работать. Или если вы обращаетесь к этому RichTextBox в каком-то другом потоке.

+0

Нет, это неправда. Прежде всего, я добавил блокировку в последнее время, и нарушение доступа происходило до и после добавления. Кроме того, нет «другого потока», поскольку я вызывал обновления в потоке графического интерфейса. Во всяком случае, блокировка никогда не вызовет описанную вами проблему. – Ozzah

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