我有一个控制台重定向到的RichTextBox。控制台重定向器在每次写入控制台时委派AppendText()调用。但是,在文本被追加时GUI被锁定,并且由于日志是在快速连续的时间段内被写入的,所以主线程/ GUI锁定直到文本不再被追加。有没有一种方法可以在日志从另一个线程追加时允许控制窗体?委派给GUI时避免主线程锁定
1
A
回答
3
不,您无法安全地从非UI线程更新UI。
如果您还有其他需要完成的UI工作,则需要使用控制台重定向功能只需花更少的时间更新UI。不要让它随时更新所有内容。是否缓冲数据并不太频繁地写入UI,或者如果数据太多以至于无法显示所有内容(同时还在执行其他必要的工作),则可以调节控制台输入。
2
总之,不,你不能摆脱锁定。 UI线程在工作时会被锁定,当你调度它的时候,实质上是说我想在UI线程上运行这段代码。
为了减轻一些“锁定”,你需要尝试对它“聪明”。
- 更新尽可能少的来管理这个,使用某种“缓冲区”来更新。可能使“假”UI类(也称为模型/ DTO)填充数据从您的线程并在需要/按需/完成时将其刷新到UI
- 尽可能地在委托中。不要执行任何形式的逻辑,因为这会使您锁定的时间超过需要的时间。
我看到你正在使用winforms,如果这是一个项目,你在控制,然后去WPF。
相关问题
- 1. C并行垃圾收集器,如何避免锁定主线程
- 2. NSOperationQueue和发送委托给主线程
- 3. 避免频繁锁定
- 4. 避免死锁 - 过程
- 5. NSFileManager removeItemAtPath锁定主线程
- 6. 主线程锁定在C#
- 7. NSThread detachNewThreadSelector锁定主线程
- 8. 使用超时避免Java多线程中的死锁
- 9. 多线程锁定Java Swing GUI
- 10. 委托代码从主线程运行主线程来处理gui
- 11. 避免螺旋锁死锁
- 12. 避免多线程进程中的死锁
- 13. 如何避免在主线程中同时调用该方法?
- 14. 主线程被阻塞时避免表视图didSelectRowIndexPath动作
- 15. 工作,避免锁
- 16. 使用委托模式时避免EXC_BAD_ACCESS
- 17. 在桌面窗口集合更改时锁定异步委派?
- 18. 委派线程安全ConcurrentMap和的AtomicInteger
- 19. 在多线程操作中避免GUI冻结
- 20. 避免了跨线程异常,但GUI不更新
- 21. 如何避免当一个线程锁定大地图时冻结其他线程
- 22. 合作/非抢先式线程避免死锁?
- 23. 如何避免被GIT repo/SSH锁定?
- 24. MySQL - 如何避免查询锁定
- 25. 避免sqlite3的数据库锁定
- 26. 如何避免在MongoDB中锁定
- 27. 优化mysql表以避免锁定
- 28. 加载Android UI以避免锁定
- 29. sqlite3:避免“数据库锁定”冲突
- 30. C#避免文件锁定Assembly.Load
'每次控制台写入'控制台重定向器委托AppendText()调用' 在UI线程上调用委托吗? – Vikhram