我做了一個'FlowDocument',一個WPF對象,來自DoWork的System.ComponentMode.BackgroundWorker,但我無法在WPF UI線程中訪問它。我想知道當我在另一個線程中訪問一個WPF對象時,我需要使用dispatcher()。 但RunWorkerCompleted()不是UI的另一個線程,所以我很困惑。 我如何訪問myFlowDocument?BackgroundWorker和WPF
3
A
回答
2
問題是因爲FlowDocument是在與UI線程不同的線程中創建的。
您將需要在主UI線程上創建流文檔。然後在您的後臺工作人員中,您將不得不使用流程文檔Dispatcher.Invoke來設置屬性並創建項目。在你的簡單例子中,使用後臺工作者並沒有真正的優勢。工人應該用來處理你長時間運行的過程。
唯一的另一種方式可能是在後臺工作者中創建文檔,將其序列化到內存流中,然後在您返回到UI線程後反序列化。
0
正如Bob Vale正確指出的那樣;從不在另一個線程上創建UI對象是一條通用的經驗法則。當您創建演示文稿對象時;你應該在UI線程上做到這一點。後臺任務應該返回簡單的數據。我會改變的DoWork的看起來像這樣:
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);
}
在這種情況下,什麼樣的調度員正在做的是讓你來安排:
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";
}
,那麼你可以將文檔內容的通過Dispatcher設置在擁有UI的線程中工作(在這種情況下是委託)。
0
我做了一個 'FlowDocument的',一個WPF對象,從DoWork的System.ComponentMode.BackgroundWorker
的
不要那樣做。 UI對象需要從UI線程創建和更新。
相關問題
- 1. WPF和backgroundworker問題
- 2. WPF/BackgroundWorker和BitmapSource問題
- 3. WPF中的BackgroundWorker和Dispatcher.BeginInvoke
- 4. WPF BackgroundWorker執行
- 5. WPF中的backgroundworker類
- 6. wpf BackgroundWorker - 關於更新UI
- 7. ProgressBar與WPF中的BackgroundWorker
- 8. 使用backgroundworker更新datagrid WPF
- 9. BackgroundWorker和ConcurrentQueue
- 10. BackgroundWorker和Threads
- 11. BackgroundWorker和CollectionViewSource
- 12. c#filesystemwatcher和backgroundworker
- 13. Backgroundworker和圖像
- 14. documentviewer和backgroundworker
- 15. 如何在BackgroundWorker中創建WPF窗口?
- 16. WPF C#BackgroundWorker使用的方法
- 17. WPF BackgroundWorker主窗口加載時
- 18. 從WinForms創建WPF窗口BackgroundWorker
- 19. WPF BackgroundWorker異常消息顯示
- 20. WPF BackgroundWorker ListView過濾器問題
- 21. WPF從主線程停止BackgroundWorker
- 22. 的BackgroundWorker停止WPF UI被刷新
- 23. wpf線程,backgroundworker,調度程序
- 24. BackgroundWorker的+ WPF - >冷凍窗口
- 25. 而不ProgressChanged BackgroundWorker的更新GUI在WPF
- 26. WPF等待光標與BackgroundWorker線程
- 27. WPF BackGroundWorker ProgressChanged不更新文本塊
- 28. WPF最好從BackgroundWorker更新進度條
- 29. 與進度條backgroundworker兩個問題WPF
- 30. WPF CrossThreadException在App.xaml中與BackgroundWorker的
但fviewer和流程文檔是在單獨的線程上創建的,所以您不能將它們組合在一起。 –
你的代碼沒有工作。它發生了同樣的例外。謝謝。 – mjk6026
@Bob - 確實。很好的接收。我已經更新了我的答案。 – vcsjones