使用大量文本更新多行文本框的最快方法

val*_*alv 2 .net c# textbox winforms

我有一个.NET 4.5 WinForm程序,它使用ODBC查询基于文本的数据库.然后我想在多行文本框中显示每个结果,我想以最快的方式完成.
在更新/填充文本框期间,GUI不必是可用的.但是,如果我能更新进度条让用户知道发生了什么事情,那就太好了.我相信后台工作者或新线程/任务是必要的,但我从来没有实现过.

我最初使用这个代码并且它很慢,因为它在继续下一个之前每行都绘制了结果.

OdbcDataReader dbReader = com.ExecuteReader();
while (dbReader.Read())
{
   txtDatabaseResults.AppendText(dbReader[0].ToString());
}
Run Code Online (Sandbox Code Playgroud)

这明显更快.

string resultString = "";
while (dbReader.Read())
{
   resultString += dbReader[0].ToString();
}
txtDatabaseResults.Text = resultString;
Run Code Online (Sandbox Code Playgroud)

但是在文本框生效之前有一段慷慨的等待时间,所以我想知道操作是否可以更快.现在我从文件中获取大约7,000行,我认为没有必要切换到AvalonEdit(如果我的思维方式错误,请纠正我,但我想保持简单并使用内置文本框).

Ree*_*sey 6

通过使用StringBuilder而不是使用字符串连接,可以使速度更快.

var results = new StringBuilder();
while (dbReader.Read())
{
    results.Append(dbReader[0].ToString());
}
txtDatabaseResults.Text = results.ToString();
Run Code Online (Sandbox Code Playgroud)

使用string和连接会给GC带来很大的压力,特别是如果你要附加7000行文本.每次使用时string +=,CLR都会创建一个新的字符串实例,这意味着旧的字符串实例(逐渐变大和变大)需要进行垃圾回收. StringBuilder避免这个问题.

请注意,将文本分配给TextBox它时仍会有延迟,因为它需要刷新并显示该文本.该TextBox控制还没有为文本的量最优化,从而可以是一个瓶颈.

至于将其推送到后台线程 - 因为您使用的是.NET 4.5,您可以使用新的异步支持来处理这个问题.这可以通过将包含此代码的方法标记为async,并使用如下代码:

string resultString = await Task.Run(()=>
{
    var results = new StringBuilder();
    while (dbReader.Read())
    {
        results.Append(dbReader[0].ToString());
    }
    return results.ToString();
});

txtDatabaseResults.Text = resultString;
Run Code Online (Sandbox Code Playgroud)