我在写语法高亮的文本编辑器时遇到了问题,经过分析应该是跨线程改变SelectionFont时线程会自动再次启动所致。整理问题代码大致如下:
public void PaintLine()
{
richTextBox1.Select(richTextBox1.SelectionStart - 1,1);
richTextBox1.SelectionFont = new Font("黑体", 12);
}
private void richTextBox1_TextChanged(object sender, KeyEventArgs e)
{
Thread TPaint = new Thread(PaintLine);
TPaint.IsBackground = true;
TPaint.Start();
}
当我在richtextbox里随便输入一个字母后,首先这个字母会被设置成黑体12号字,然后会提示“System.ArgumentOutOfRangeException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生
其他信息: InvalidArgument=“-1”的值对于“start”无效”。
也就是说线程TPaint成功运行了一次之后再次被运行了,导致SelectionStart - 1的值变为了-1,从而引发了错误。当我把
Thread TPaint = new Thread(PaintLine);
TPaint.IsBackground = true;
TPaint.Start();
注释掉,换成 PaintLine(); 就一点问题都没有。求教这是为什么?百思不得其解啊!
public void PaintLine()
{
richTextBox1.Select(richTextBox1.SelectionStart - 1,1);
richTextBox1.SelectionFont = new Font("黑体", 12);
}
private void richTextBox1_TextChanged(object sender, KeyEventArgs e)
{
Thread TPaint = new Thread(PaintLine);
TPaint.IsBackground = true;
TPaint.Start();
}
当我在richtextbox里随便输入一个字母后,首先这个字母会被设置成黑体12号字,然后会提示“System.ArgumentOutOfRangeException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生
其他信息: InvalidArgument=“-1”的值对于“start”无效”。
也就是说线程TPaint成功运行了一次之后再次被运行了,导致SelectionStart - 1的值变为了-1,从而引发了错误。当我把
Thread TPaint = new Thread(PaintLine);
TPaint.IsBackground = true;
TPaint.Start();
注释掉,换成 PaintLine(); 就一点问题都没有。求教这是为什么?百思不得其解啊!