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

时间:2015-12-19 22:27:27

标签: c# multithreading winforms

我有一个控制台重定向到的RichTextBox。每次写入控制台时,控制台重定向器都会委派AppendText()调用。但是,GUI会在附加文本时锁定,并且由于日志是在快速连续的时间段内写入的,因此主线程/ GUI会锁定,直到不再附加文本为止。有没有办法在从另一个线程追加日志时允许控制表单?

2 个答案:

答案 0 :(得分:3)

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

如果您有其他想要完成的UI工作,您需要让控制台重定向功能只需花费更少的时间来更新UI。不要让它随时更新UI。让它缓冲数据并减少写入UI的频率,或者如果有太多数据显示所有内容(同时还做其他必要的工作),则限制控制台输入。

答案 1 :(得分:2)

总而言之,没有你无法摆脱锁定。 UI线程在工作时将被锁定,当你调度它时,你实际上在说,我想在UI线程上运行这段代码。

缓解一些“锁定”问题。你需要努力做到"聪明"关于它。

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

我看到你正在使用winforms,如果这是你控制的项目,那么去WPF。