richTextBox 控件的System.StackOverflowException错误问题

问题描述

在一个多线程程序中调用richTextBox老是在运行一段时间后报错代码如下,richText在2000行左右的时候就报错未处理的“System.StackOverflowException”类型的异常出现在System.Windows.Forms.dll中。publicvoidLogAppendLine(System.Windows.Forms.RichTextBoxrichTextBoxRemote,Colorcolor,stringtext){if(richTextBoxRemote!=null&&richTextBoxRemote.Parent!=null&&richTextBoxRemote.Parent.IsHandleCreated&&richTextBoxRemote.IsHandleCreated&&!richTextBoxRemote.IsDisposed){try{richTextBoxRemote.InvokeIfNeeded((str)=>{if(richTextBoxRemote.Text.Length>(richTextBoxRemote.MaxLength-100000)){richTextBoxRemote.Clear();}StringBuilderstrb=newStringBuilder(richTextBoxRemote.Text);//strb.Append("");strb.AppendLine(text);//strb.Append("rn");strings=strb.ToString();//这里出错richTextBoxRemote.Text=s;richTextBoxRemote.SelectionColor=color;richTextBoxRemote.Refresh();//richTextBoxRemote.Focus();//获取焦点richTextBoxRemote.Select(richTextBoxRemote.TextLength,0);//光标定位到文本最后richTextBoxRemote.ScrollToCaret();//滚动到光标处Application.DoEvents();},text);}catch(Exceptionex){//throw;}}}

解决方案

解决方案二:
Application.DoEvents();无意义去掉再测试下看看
解决方案三:
不要老去操作滚动条,这样是会报错的你可以把新内容追加到字符串的前面,倒序显示
解决方案四:
引用1楼mervyn807的回复:

Application.DoEvents();无意义去掉再测试下看看

去掉后会假死引用2楼Z65443344的回复:

不要老去操作滚动条,这样是会报错的你可以把新内容追加到字符串的前面,倒序显示

还是会抛出错误if(richTextBoxRemote.Text.Length>(richTextBoxRemote.MaxLength-100000)){到这里就出现了
解决方案五:
再跑一次也出错了
解决方案六:
到底抛什么错误,放出来看看
解决方案七:
引用5楼Z65443344的回复:

到底抛什么错误,放出来看看

未处理的“System.StackOverflowException”类型的异常出现在System.Windows.Forms.dll中。
解决方案八:
如果Application.DoEvents();去掉后会假死,说明你根本没在线程里执行这个代码,阻塞主线程了
解决方案九:
字面上翻译过来是堆栈溢出错误。应该是出现了无限循环或者无限递归
解决方案十:
引用8楼liuhuibing12的回复:

字面上翻译过来是堆栈溢出错误。应该是出现了无限循环或者无限递归

我想了很久,也许和我的业务有关我在多线程中非常频繁的调用这个方法,但是这个方法执行没有调用的快,然后栈中不停的积压这个方法,导致栈空间被使用完了我要怎么改变这个业务才能避免这种错误呢?
解决方案十一:
你想了这么久,都是异想天开。1、先了解下Application.DoEvents交出CPU控制权,让系统可以处理队列中的所有Windows消息,比如在大运算量循环内,加Application.DoEvents可以防止界面停止响应,因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它,而去处理消息队列中的消息。像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样。(耗时操作用的比较多)

2、函数调用,是函数地址入栈,你可以拿你的机器测试下一个函数地址的字节大小。你的调用竟然能把栈耗尽,这个听起来有点滑稽。之所以抛错,估计是你频繁的移动滚轮,造成richtextbox每次重绘,导致堆栈溢出。
解决方案十二:
引用10楼lovelj2012的回复:

你想了这么久,都是异想天开。1、先了解下Application.DoEvents交出CPU控制权,让系统可以处理队列中的所有Windows消息,比如在大运算量循环内,加Application.DoEvents可以防止界面停止响应,因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它,而去处理消息队列中的消息。像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样。(耗时操作用的比较多)

2、函数调用,是函数地址入栈,你可以拿你的机器测试下一个函数地址的字节大小。你的调用竟然能把栈耗尽,这个听起来有点滑稽。之所以抛错,估计是你频繁的移动滚轮,造成richtextbox每次重绘,导致堆栈溢出。

估计你没有看我修改后的代码修改后的代码已经去掉了滚动功能我开了1000个线程调用这个函数不用Application.DoEvents肯定会卡死
解决方案十三:
开了1000个线程调用这个函数-----------天雷滚滚!~
解决方案十四:
引用12楼Z65443344的回复:

开了1000个线程调用这个函数-----------天雷滚滚!~

这个是服务端的一段代码,有1000个线程调用是很正常的事
解决方案十五:
引用13楼ayun00的回复:

Quote: 引用12楼Z65443344的回复:
开了1000个线程调用这个函数-----------天雷滚滚!~

这个是服务端的一段代码,有1000个线程调用是很正常的事

使用线程池来管理你的线程
其他方案:
引用13楼ayun00的回复:

Quote: 引用12楼Z65443344的回复:
开了1000个线程调用这个函数-----------天雷滚滚!~

这个是服务端的一段代码,有1000个线程调用是很正常的事

既然是服务端的代码,为什么要更新到richtextbox里去,谁会看?把结果先保存到list,有人看的时候再用控件显示,没必要实时显示,也不要乱用委托.
其他方案:
引用15楼Z65443344的回复:

Quote: 引用13楼ayun00的回复:
Quote: 引用12楼Z65443344的回复:
开了1000个线程调用这个函数-----------天雷滚滚!~

这个是服务端的一段代码,有1000个线程调用是很正常的事

既然是服务端的代码,为什么要更新到richtextbox里去,谁会看?把结果先保存到list,有人看的时候再用控件显示,没必要实时显示,也不要乱用委托.

有时候服务器端程序,也是需要展现信息的。比如前置机,虽然一般没人盯着,但是展示实时请求、应答,还是有意义的。
其他方案:
怎么解决这个问题呢,现在窗口一打开几分钟就溢出了
其他方案:
引用17楼ayun00的回复:

怎么解决这个问题呢,现在窗口一打开几分钟就溢出了

推荐你使用log4net把内容显示在RichTextBox控件
其他方案:
Application.DoEvents执行事件一般WinForm拖动控件或设置消息循环,出现这个堆栈溢出你用这个命令基本是可以解决的。当然不排除你程序有死循环无限递归造成的溢出
其他方案:
引用18楼lovelj2012的回复:

Quote: 引用17楼ayun00的回复:
怎么解决这个问题呢,现在窗口一打开几分钟就溢出了

推荐你使用log4net把内容显示在RichTextBox控件

还没有研究过log4net引用19楼Windowsvipcuvs的回复:

Application.DoEvents执行事件一般WinForm拖动控件或设置消息循环,出现这个堆栈溢出你用这个命令基本是可以解决的。当然不排除你程序有死循环无限递归造成的溢出

问题是现在没有解决啊
其他方案:
引用9楼ayun00的回复:

Quote: 引用8楼liuhuibing12的回复:
字面上翻译过来是堆栈溢出错误。应该是出现了无限循环或者无限递归

我想了很久,也许和我的业务有关我在多线程中非常频繁的调用这个方法,但是这个方法执行没有调用的快,然后栈中不停的积压这个方法,导致栈空间被使用完了我要怎么改变这个业务才能避免这种错误呢?

对于这种情况我通常是ReactiveExtension去限流,例如典型的每隔1s响应一次,或者采用Throttle,本质上都是为了减少不必要的事件执行。
其他方案:
引用21楼lincolnandlinda的回复:

Quote: 引用9楼ayun00的回复:
Quote: 引用8楼liuhuibing12的回复:
字面上翻译过来是堆栈溢出错误。应该是出现了无限循环或者无限递归

我想了很久,也许和我的业务有关我在多线程中非常频繁的调用这个方法,但是这个方法执行没有调用的快,然后栈中不停的积压这个方法,导致栈空间被使用完了我要怎么改变这个业务才能避免这种错误呢?

对于这种情况我通常是ReactiveExtension去限流,例如典型的每隔1s响应一次,或者采用Throttle,本质上都是为了减少不必要的事件执行。

能给个demo吗?
其他方案:
引用21楼lincolnandlinda的回复:

Quote: 引用9楼ayun00的回复:
Quote: 引用8楼liuhuibing12的回复:
字面上翻译过来是堆栈溢出错误。应该是出现了无限循环或者无限递归

我想了很久,也许和我的业务有关我在多线程中非常频繁的调用这个方法,但是这个方法执行没有调用的快,然后栈中不停的积压这个方法,导致栈空间被使用完了我要怎么改变这个业务才能避免这种错误呢?

对于这种情况我通常是ReactiveExtension去限流,例如典型的每隔1s响应一次,或者采用Throttle,本质上都是为了减少不必要的事件执行。

百度了下,只看到对textbox的TextChanged的范例,像我这种没有控件,自定义事件的怎么处理
其他方案:
没人玩过这个吗?
其他方案:
先写日志文件里,需要看的时候从文件里读出来看或者后台用个list<string>作为缓存,每秒或者每5秒刷新一次,内容显示到控件过期数据丢弃,或者先写文件再丢弃,否则运行时间一长,内存就爆了不要所有数据都放控件里,即使控件本身没有限制,它毕竟是占内存的,早晚会有内存不足的时候
其他方案:
引用25楼Z65443344的回复:

先写日志文件里,需要看的时候从文件里读出来看或者后台用个list<string>作为缓存,每秒或者每5秒刷新一次,内容显示到控件过期数据丢弃,或者先写文件再丢弃,否则运行时间一长,内存就爆了不要所有数据都放控件里,即使控件本身没有限制,它毕竟是占内存的,早晚会有内存不足的时候

恩我是看到上面兄弟说的ReactiveExtension,有点意思,想弄一下,如果实在没有办法就只有开一个线程去缓存显示了
其他方案:
尝试一下线程池的管理,用好线程池你的这个问题也许就解决了
其他方案:
引用27楼piaopiao_lucky的回复:

尝试一下线程池的管理,用好线程池你的这个问题也许就解决了

没明白你的意思

时间: 2024-10-24 05:38:22

richTextBox 控件的System.StackOverflowException错误问题的相关文章

用于RichTextBox控件记录日志信息

using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Windows.Forms; namespace SPD.ERP.Common{    public class WriteLog    {        public delegate void LogAppendDelegate(Color color, string text);        R

在RichTextBox控件加入图片

控件 using System;using System.Collections.Specialized;using System.Drawing;using System.Drawing.Imaging;using System.IO;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms; namespace Khendys.Controls {  #region Public Enu

数据绑定 richtextbox-C# Richtextbox控件数据绑定之后,无法正常输入

问题描述 C# Richtextbox控件数据绑定之后,无法正常输入 最近在做winform系统时候遇到一个问题,百思不得其解,希望高手可以帮忙解决一下. 如下所示,有一个richtextbox控件,name是rtbZLBB, 后台有一个类, 是ZLBB,现在将richtextbox绑定到ZLBB对象上,但是在输入内容到richtextbox控件的时候,发现无法正常的追加输入,每一次输入光标都是停留在最前面,请问高手这是为什么?进过分析,把Content属性换成private或protected

使用 Visual C# .NET 打印 RichTextBox 控件的内容 的问题

问题描述 借此宝地问一下,我按照这个网页的方法打印RichTextBox控件的内容,可是进行到"9.将RichTextBoxPrintCtrl从工具箱拖入Form1."就不对了.还是没有这个控件.请问各位高手如何解决这个问题?http://support.microsoft.com/kb/812425 解决方案

XP下运行VC6,使用TEECHART控件出现应用程序错误

问题描述 XP下运行VC6,使用TEECHART控件出现应用程序错误 无论是teechart V5还是V8都不行,初始化加入"m_chart.Series(0).FillSampleValues(50);就错误了 解决方案 你存在没有分配内存的野指针,应该和teechart没有什么关系.

RichTextBox 控件的输入法问题

问题描述 我在c#2003winform中使用了richtext控件.在其keydown事件中有有个一句stringx=richtextbox.text;这个语句会导致:当我用紫光拼音在该richtextbox控件中输入汉字时正常,但当我用微软拼音输入法等其他输入法时,输入法丧失了连续用拼音选择多个汉字的能力,而是每次只能输入两个汉字,用户有意见,因为输入法的联想功能丧失了.有没有解决办法? 解决方案 解决方案二:光用这个就能导致?那这句话用来干嘛啊?可不可以在内容发生改变的事件里面用这句?解决

vs2010 winform 程序开发 怎么在richtextbox控件中设置二级标题

问题描述 我的思路是这样的,做一个rtf格式的文件,在里面设置好正文,一级标题,二级标题,三级标题格式,然后在richTextbox控件中读取这个rtf格式的文件,我现在要往这个richtextbox控件中写入文本,怎样设置成设定好的一级标题或二级标题的格式 解决方案 解决方案二:百度rtf格式文件解决方案三:引用1楼sxldfang的回复: 百度rtf格式文件 搜不到,我现在要往这个richtextbox控件中写入文本,怎样设置成设定好的一级标题或二级标题的格式解决方案四:rtf里面弄好格式,

duilib 修复padding属性导致其他控件自动计算宽高度错误的bug和导致自己宽高度错误的bug

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42950733          BUG 一:padding导致其他控件宽度计算错误             今天在写项目的一个布局时,用到了最常用的相对布局属性padding:在一个纵向容器里,给其中的各个子元素设置了padding属性来做相对布局.但是出现了很奇怪的现象:容器的最后一个元素本应该在最底部,但是实际却留出了一部分空白.          实际上这个bug

在我机器Vs.net中使用Teechart控件,编好程序之后为什么在另外一台机器上得VS.net中打不开 Teechart控件,提示有错误

问题描述 在我机器Vs.net中使用Teechart控件,编好程序之后为什么在另外一台机器上得VS.net中打不开Teechart控件,提示有错误 解决方案 解决方案二:顶起来先