WinForm非常经典的一个问题,跨线程操作UI的时候会报错,处理方式:
简单粗暴款:
问就是不推荐,会出现一些奇怪的问题,比如我设置了标签值,但是却没有生效。
CheckForIllegalCrossThreadCalls =false;
使用委托款:
推荐,让创建界面的线程来负责更新它,即聚餐常说的谁点的谁来吃完。
定义一个委托:
/// <summary>
/// 设置日志控件值
/// </summary>
/// <param name="text"></param>
/// <param name="logLevel">1=Info 2=Success 3=Error</param>
private void SetLogTextBoxText(string text, LogLevel logLevel = LogLevel.Info)
{
log_richTextBox.SelectionStart = log_richTextBox.TextLength;
log_richTextBox.SelectionLength = 0;
log_richTextBox.SelectionColor = logLevel switch
{
LogLevel.Info => Color.Black,
LogLevel.Success => Color.Green,
LogLevel.Error => Color.Red,
_ => log_richTextBox.ForeColor
};
log_richTextBox.AppendText(text);
log_richTextBox.SelectionColor = log_richTextBox.ForeColor;
//以上实现控制输出内容的颜色,比如这次输出红色,下次输出绿色
log_richTextBox.SelectionStart = log_richTextBox.TextLength;
log_richTextBox.ScrollToCaret();
//这两行实现光标定位到末尾,可以达到滚动输出效果
}
触发它(更新值):
Invoke(SetLogTextBoxText, log, LogLevel.Error);