2015-12-19 24 views
1

我有一个控制台重定向到的RichTextBox。控制台重定向器在每次写入控制台时委派AppendText()调用。但是,在文本被追加时GUI被锁定,并且由于日志是在快速连续的时间段内被写入的,所以主线程/ GUI锁定直到文本不再被追加。有没有一种方法可以在日志从另一个线程追加时允许控制窗体?委派给GUI时避免主线程锁定

+0

'每次控制台写入'控制台重定向器委托AppendText()调用' 在UI线程上调用委托吗? – Vikhram

回答

3

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

如果您还有其他需要完成的UI工作,则需要使用控制台重定向功能只需花更少的时间更新UI。不要让它随时更新所有内容。是否缓冲数据并不太频繁地写入UI,或者如果数据太多以至于无法显示所有内容(同时还在执行其他必要的工作),则可以调节控制台输入。

2

总之,不,你不能摆脱锁定。 UI线程在工作时会被锁定,当你调度它的时候,实质上是说我想在UI线程上运行这段代码。

为了减轻一些“锁定”,你需要尝试对它“聪明”。

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

我看到你正在使用winforms,如果这是一个项目,你在控制,然后去WPF。