2013-09-14 2 views
3

Имейте проблему, которую очень трудно воспроизвести.
Исключение:Есть BackgroundWorker.RunWorkerCompleted Thread Safe

e.Exception.Message = Object reference not set to an instance of an object. 
e.Exception.StackTrace 
at System.Windows.Controls.ItemContainerGenerator.MoveToPosition(GeneratorPosition position, GeneratorDirection direction, Boolean allowStartAtRealizedItem, GeneratorState& state) 
at System.Windows.Controls.ItemContainerGenerator.Generator..ctor(ItemContainerGenerator factory, GeneratorPosition position, GeneratorDirection direction, Boolean allowStartAtRealizedItem) 

Ловля, что в App.cs App_DispatcherUnhandledException

Я думаю, что это из XAML, как я Перерыв на Метательном включены для каждого варианта в Visual Studio.
И я уверен, что у меня есть весь код, завернутый в Try Catch.
Наверняка, страница, на которой, как я думаю, возникла ошибка, забирает весь код за исключениями.
Если я сломаюсь на получение этих публичных объектов, я не могу воспроизвести ошибку.
Поскольку я замедляю его, чтобы попробовать и отлаживать, его труднее воспроизвести.

Имейте несколько вкладок, где я показываю текст, используя TextBlock и форматированный текст, используя FlowDocumentViewer.

Источник обязателен для публичных объектов. Публичное свойство TextBlock.Text - это RawText, а переменная подстановки - rawText.

Я получаю текст и информацию для форматирования текста на BackgroundWorker, который создается в потоке пользовательского интерфейса ..
Перед вызовом BackgroundWorker я поставил rawText, чтобы «получать текст» и вызвать CancelAsync(), если BackgroundWorker IsBusy ,
Затем в RunWorkerCompletedEventHandler я установил rawText в фактический текст. Затем я вызываю notifypropertychanged, если эта вкладка выбрана так, чтобы она не отображалась, если она не видна.

Возможно, проблема в том, что я меняю rawText в RunWorkerCompletedEventHandler, пока элемент управления читает rawText? Или я меняю rawText на «получение текста», пока элемент управления пользовательского интерфейса читает текст?

И другие мысли?

Поместив блокировки на эти задания, исправьте это?

Не MVVM.

Я думал, что я достаточно описал код, но, видимо, нет.

rawText = "getting text"; 
backgroundWorker.RunWorkerAsync(input); 

затем в RunWorkerCompleted

DocTextAndHighlight docTextAndHighlight = (GabeLib.DocTextAndHighlight)e.Result; 
rawText = docTextAndHighlight.RawText; 

NotifyPropertyChanged на RawText вызывается только если вкладка открыта.

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

Это может быть старый компонент com с интерфейсом DDE.
Один вызов метода сообщает об этой же ошибке.
Это вызов метода, который терпит неудачу только 1 из 10 000.
Но если он терпит неудачу, он будет сбой в блоках.
И этот вызов находится в блоке try catch, но по какой-то причине он не попадает в прямой блок. Предоставлено, что ошибка имеет очень мало информации, но это точно такая же ошибка. Плохая часть заключается в том, что она вызывает сбой приложения.
Я могу установить e.Handled = true; но он по-прежнему часто вызывает ошибку, чтобы свернуть приложение.

+0

Голосовать за закрытие? Что еще тебе нужно? Я не знаю, какая строка выбрасывает исключение, поэтому я не знаю, какой код отправлять. Как я утверждаю, я думаю, что это происходит от рендеринга. – Paparazzi

+0

Два голоса, чтобы закрыть? Какая вам информация? – Paparazzi

+0

Нам нужен репрограммирование, что-то, что мы можем запустить и отладить. Трассировка стека полностью неадекватна. Сейчас даже не ясно, является ли это еще одним исключением, которое WPF проглатывает, и это многое делает. Отметьте флажок «Бросок», и вы станете более счастливым пользователем WPF. –

ответ

2

DoWork будет работать в потоке потока потока, а RunWorkerCompleted будет работать в потоке пользовательского интерфейса, обеспечить, чтобы ваш BackgroundWorker был создан в потоке пользовательского интерфейса.

И из MSDN:

Ваш обработчик события RunWorkerCompleted должен всегда проверять AsyncCompletedEventArgs.Error и AsyncCompletedEventArgs.Cancelled свойства перед обращением к свойству RunWorkerCompletedEventArgs.Result. Если возникло исключение или прекращена операция, доступ к свойству RunWorkerCompletedEventArgs.Result вызывает исключение. (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted.aspx):

+0

Замки как фикс были досягаемости. My BackgroundWorker создается в потоке пользовательского интерфейса. – Paparazzi