在委托给GUI时避免主线程锁定

本文关键字:线程 锁定 GUI | 更新日期: 2023-09-27 18:27:23

我有一个RichTextBox,控制台被重定向到它。每次向控制台写入时,控制台重定向器都会委托AppendText()调用。但是,在附加文本时,GUI会锁定,并且由于日志是连续快速写入的,所以主线程/GUI会锁定,直到不再附加文本。有没有一种方法可以在从另一个线程附加日志时允许控制表单?

在委托给GUI时避免主线程锁定

否,您无法从非UI线程安全地更新UI。

如果你有其他想要完成的UI工作,你需要拥有控制台重定向功能,只需花更少的时间更新UI。不要让它一直用所有的东西更新UI。让它缓冲数据并减少对UI的写入频率,或者在数据太多而无法显示所有内容的情况下限制控制台输入(同时还要做其他必要的工作)。

总而言之,不,你无法摆脱封锁。UI线程在工作时会被锁定,当你向它调度时,你本质上是在说,我想在UI线程上运行这段代码。

为了缓解一些"封锁",你需要试着"聪明"一点。

  • 尽可能少地更新以管理这一点,使用某种"缓冲区"进行更新。可能会制作一个"假"UI类(也称为模型/DTO),用线程中的数据填充它,并在需要/按需/完成时将其刷新到UI
  • 在学员中尽可能多。不要执行任何形式的逻辑,因为这会让你锁定更长的时间

我看到你在使用winforms,如果这是一个你可以控制的项目,那么就选择WPF。