C#自定义RichTextBox加载文件死慢!!

茗香淡然 2016-02-24 12:46:42
在网上抄了段代码,作用【关闭自动选择字符/生僻字显示】。
测试一下发现加载小文档没问题(秒显),但加载长文档慢得让人抓狂(如加载五笔词库,大概76000+行),要十几二十秒才显示出来,过程就像假死一样。

VS自带的RichTextBox 加载五笔词库大概3秒以内。这个问题出在哪里???

请大神指点优化一下。

using System;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace 文件加载速度测试
{
public partial class ExRichTextBox : RichTextBox
{
#region 自定义变量
const string DLL_RICHEDIT = "msftedit.dll";
/// <summary>MSFTEDIT.DLL(即RichEdit4.1版本)注册的类名是"RICHEDIT50W"</summary>
const string WC_RICHEDITW = "RICHEDIT50W";

/// <summary>用于表示指针或句柄的平台特定类型。</summary>
private IntPtr moduleHandle;
/// <summary>获取或设置一个值,尝试加载</summary>
private bool attemptedLoad;
/// <summary>用于判断鼠标是否按下</summary>
private bool _Selecting = false;
/// <summary>记录鼠标按下时的位置</summary>
private int _StartPosition = 0;

/// <summary> 加载库 </summary>
/// <param name="libname">库名</param>
/// <returns></returns>
[DllImport("Kernel32.dll")]
internal static extern IntPtr LoadLibrary(string libname);
#endregion

public ExRichTextBox()
{
InitializeComponent();

moduleHandle = IntPtr.Zero;
attemptedLoad = false;
AutoWordSelection = false;//关闭自动选字词
Font = new System.Drawing.Font(
"宋体", 12.0F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, 0);
/* 文本中出现‘西方语言’用西方字体显示,出现‘亚洲语言’则用亚洲字体显示 */
this.LanguageOption = RichTextBoxLanguageOptions.DualFont;
ShowSelectionMargin = true;
ImeMode = ImeMode.On;
}

public ExRichTextBox(IContainer container)
{
container.Add(this);

InitializeComponent();

moduleHandle = IntPtr.Zero;
attemptedLoad = false;
AutoWordSelection = false;//关闭自动选字词
Font = new System.Drawing.Font(
"宋体", 12.0F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, 0);
ShowSelectionMargin = true;
ImeMode = ImeMode.On;
}

#region 重写控件信息
/// <summary>重写控件的信息</summary>
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
AttemptToLoadNewRichEdit();
if (moduleHandle != IntPtr.Zero)
{
cp.ClassName = WC_RICHEDITW;
}
return cp;
}
}

/// <summary>尝试加载新的丰富的编辑(RichEdit)信息</summary>
void AttemptToLoadNewRichEdit()
{
// 检索动态库链接
if (!attemptedLoad)
{
attemptedLoad = true;
string strFile = Path.Combine(Environment.SystemDirectory, DLL_RICHEDIT);
moduleHandle = LoadLibrary(strFile);
}
}
#endregion

#region 重写鼠标事件
/// <summary>重写鼠标按下事件</summary>
/// <param name="e">鼠标点击事件</param>
protected override void OnMouseDown(MouseEventArgs e)
{
_Selecting = true;
_StartPosition = base.GetCharIndexFromPosition(new System.Drawing.Point(e.X, e.Y));
base.OnMouseDown(e);
}

/// <summary>重写鼠标释放事件</summary>
/// <param name="e">鼠标点击事件</param>
protected override void OnMouseUp(MouseEventArgs e)
{
AutoWordSelection = false;/* 关闭自动选字词 此项必须 */
_Selecting = false;
base.OnMouseUp(e);
if (_Selecting)
{
int charPosition = base.GetCharIndexFromPosition(new System.Drawing.Point(e.X, e.Y));
int length = 0;
if (charPosition > _StartPosition)
{
length = charPosition - _StartPosition;
Select(_StartPosition, length);
}
else if (charPosition < _StartPosition)
{
length = _StartPosition - charPosition;
Select(charPosition, length);
}
}
}
#endregion
}
}

string str2 = @"D:\Documents\五笔词库20160202.txt";
private void button1_Click(object sender, EventArgs e)
{
exRichTextBox1.Text = File.ReadAllText(str2, Encoding.Default);
//exRichTextBox1.Lines = File.ReadAllLines(str2, Encoding.Default);
}

private void button2_Click(object sender, EventArgs e)
{
exRichTextBox1.Clear();
}
...全文
161 点赞 收藏 10
写回复
10 条回复
茗香淡然 2016年02月26日
引用 7 楼 lovelj2012 的回复:
那就是你的第三方dll的问题咯
这个是 C:\Windows\System32\msftedit.dll 里的文件,不是系统自带的RTF文本编辑控件吗?
回复 点赞
茗香淡然 2016年02月26日
发现先在ExRichTextBox 中加入一个生僻字(如:
回复 点赞
茗香淡然 2016年02月26日
引用 1 楼 fei2yun 的回复:
D:\Documents\五笔词库20160202.txt 这个文件有多大?不考虑异步加载么?
怎么加载能给个例子吗?? 文件有54万+字,大概7.8万行。
回复 点赞
江南小鱼 2016年02月25日
那就是你的第三方dll的问题咯
回复 点赞
茗香淡然 2016年02月24日
        /// <summary>尝试加载新的富文本编辑(RichEdit)信息</summary>
void AttemptToLoadNewRichEdit()
{
// 检索动态库链接
if (!attemptedLoad)
{
attemptedLoad = true;
string strFile = Path.Combine(Environment.SystemDirectory, DLL_RICHEDIT);
moduleHandle = LoadLibrary(strFile);

}
}

问题出在这里,这个是什么问题??
回复 点赞
茗香淡然 2016年02月24日
引用 3 楼 lovelj2012 的回复:
你能单步调试下,看慢在哪行代码么?

exRichTextBox1.Text = File.ReadAllText(str2, Encoding.Default);
//exRichTextBox1.Lines = File.ReadAllLines(str2, Encoding.Default);

53.366秒
引用 2 楼 puler 的回复:
我觉得在搞不清楚的时候,你先分开各种步骤所需的时间,然后找到时间长的问题所在


引用 1 楼 fei2yun 的回复:
D:\Documents\五笔词库20160202.txt
这个文件有多大?不考虑异步加载么?

54万+字,不到1M。
回复 点赞
江南小鱼 2016年02月24日
你能单步调试下,看慢在哪行代码么?
回复 点赞
puler 2016年02月24日
我觉得在搞不清楚的时候,你先分开各种步骤所需的时间,然后找到时间长的问题所在
回复 点赞
君之飞云 2016年02月24日
D:\Documents\五笔词库20160202.txt 这个文件有多大?不考虑异步加载么?
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告