Как правильно указывает Боб Вейл; Общее правило - никогда не создавать объекты пользовательского интерфейса в другом потоке. При создании объектов презентации; Вы должны сделать это в потоке пользовательского интерфейса. Фоновая задача должна возвращать простые данные. Я бы изменил DoWork, чтобы он выглядел так:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
//Assume some kind of "work" is being done here.
e.Result = "Some bold text in the paragraph";
}
Тогда вы можете установить содержимое документа с помощью Диспетчер :
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Action<string> action = r =>
{
FlowDocument myFlowDocument = new FlowDocument();
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add(new Bold(new Run(r)));
myFlowDocument.Blocks.Add(myParagraph);
fviewer.Document = myFlowDocument;
};
Dispatcher.Invoke(action, (string)e.Result);
}
В этом случае Диспетчер позволяет вам планировать работу (в данном случае делегата) для потока, которому принадлежит пользовательский интерфейс.