我在RTB和文档生成方面遇到了一些与线程有关的问题。WPF RichTextBox文档创建线程问题
当RTB上触发TextChanged事件时,将创建一个新的thead,并将文档生成转移到此处。这可能需要几秒钟,阻止调用,所以它确实需要在另一个线程上以保持UI的响应。
我遇到的问题是一个例外,当我尝试将新生成的文档添加到RTB的Document
属性。 (调用线程不能访问此对象,因为不同的线程拥有它。)这不是因为忘记使用Dispatcher.Invoke
,因为那里生成了异常,而是因为我正在创建FlowDocument/Paragraph/Run实例一个除UI线程以外的线程(我认为??)。
有没有办法实现我在这里找的东西?
更新
private void rtbQuery_TextChanged(object sender, TextChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Requires update; on thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Generating; on thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
DocumentGenerator dgen = new DocumentGenerator();
string queryText = getQueryText();
e.Result = dgen.GenerateDocument(queryText);
}
private void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Assigning; on thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
FlowDocument doc = (FlowDocument)e.Result;
txtQuery.Document = doc; // ! The calling thread cannot access this object because a different thread owns it
}
>Requires update; on thread:9
>Generating; on thread:10
>Assigning; on thread:9
更新#2 - 一种解决方案
(的种类)
所以,@乔恩·米切尔指出的那样,我不能在UI线程上更新我的RTB,并在上创建一个对象其他线程。有一个非常简单的解决方案,即只需最少的代码更改,即可解决此问题,并且我将它发布以免未来人员麻烦。简而言之,在另一个线程上创建一个对象图,然后转换为XAML。然后,UI线程将该XAML转换回对象图形,并在其自己的线程中运行,并且一切正常。
private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
DocumentGenerator dgen = new DocumentGenerator();
string queryText = getQueryText();
dgen.GenerateDocument(queryText); // start generation
e.Result = dgen; // note, i'm passing the generator, not the document
}
private void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
DocumentGenerator dgen = (DocumentGenerator)e.Result;
txtQuery.Document = dgen.GetFlowDocument();
}
在DocumentGenerator类
public void GenerateDocument(string data)
{
... // build up the document DOM
// return documentDOM; // used to return the generated item here.
documentXAML = System.Windows.Markup.XamlWriter.Save(documentDOM); // serialize the DOM to XAML
}
public FlowDocument GetDocument()
{
object result = System.Windows.Markup.XamlReader.Parse(documentXAML); // build DOM from XAML
return (FlowDocument)result;
}
ahhh ....这就是链接。这是一个痛苦,但我会很满意XAML方法。感谢所有的帮助。辛苦赚来的积分;) – jasper 2011-04-08 11:15:18