У меня есть окно wpf с элементом управления RichTextBox.Когда я открываю текстовый файл, я анализирую содержимое и создаю объекты Paragraph, а затем вставляю их в RTB-документ.Все работало нормальноОднако при рефакторинге приложения я решил попытаться перенести эту процедуру в BackgroundWorker.Но когда я пытаюсь назначить полученный FlowDocument из фонового процесса обратно в RTB в основном потоке, я получаю ошибку: процесс не может получить доступ к объекту, потому что он принадлежит другому потоку.Я обращаюсь к FlowDocument из метода Worker RunWorkerCompleted.Должен ли я быть в состоянии передать его в RTB оттуда?
Я попытался установить e.Result для FlowDocument, созданного в методе DoWork, а затем назначить его для RTB в методе RunWorkerCompleted.Я также попытался передать FlowDocument, созданный в главном потоке, в метод DoWork, в случае, если я получил ошибку, потому что FlowDocument создавался в фоновом потоке.
Это была моя первая попытка:
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
string[] paragraphs = (string[])e.Argument;
FlowDocument document = new FlowDocument();
foreach (string paragraph in paragraphs)
{
// Create paragraph object.
Paragraph paragraphContent = new Paragraph(new Run(paragraph));
// Check maximum length.
paragraphContent.Background = CheckParagraphLength(paragraphContent);
//Add paragraph to document.
document.Blocks.Add(paragraphContent);
}
e.Result = document;
}
Я попытался создать объект для передачи в метод DoWork:
public class DocInfo
{
public string[] paragraphs {get; set;}
public FlowDocument document {get; set;}
}
... и передал это objecto методу:
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
DocInfo doc = (DocInfo)e.Argument;
foreach (string paragraph in doc.paragraphs)
{
// Create paragraph object.
Paragraph paragraphContent = new Paragraph(new Run(paragraph));
// Check maximum length.
paragraphContent.Background = CheckParagraphLength(paragraphContent);
// Add paragraph to document.
doc.document.Blocks.Add(paragraphContent);
}
e.Result = doc;
}
В первом метод RunWorkerCompleted был:
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Editor.Document = (FlowDocument)e.Result;
}
Во втором:
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Editor.Document = ((FlowDocument)e.Result).document;
}
В обоих случаях результатом была ошибка доступа к объекту в методе RunWorkerCompleted.