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(如果我的思维方式错误,请纠正我,但我想保持简单并使用内置文本框).
通过使用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)
| 归档时间: |
|
| 查看次数: |
3236 次 |
| 最近记录: |