use*_*809 6 c# io backgroundworker
我确信我们都熟悉并且可能使用书籍,在线等提供的大量代码来使用C#读取文件.像......那样简单
StringBuilder fiContents = new StringBuilder();
using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
{
while (!fi.EndOfStream)
{
fiContents.Append(fi.ReadLine);
}
}
Run Code Online (Sandbox Code Playgroud)
或者可能是......
using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
fiContents.Append(fi.ReadToEnd());
Run Code Online (Sandbox Code Playgroud)
现在让我们去超级赛亚人片刻做一些真正有趣的东西,比如有一个BackgroundWorker可以让我们显示一个加载图像(我将使用它),提供一个进程倒数计时器或ProgressBar.
public void ReadFile(string filename)
{
BackgroundWorker procFile = new BackgroundWorker();
// Progress 1: If we want to show the progress we need to enable the following property
// procFile.WorkerReportsProgress = true;
profile.DoWork += new DoWorkEventHandler((object obj, DoWorkEventArgs ev) =>
{
StringBuilder fiContents = new StringBuilder();
using (StreamReader fi = new StreamReader(filename))
{
while (!fi.EndOfStream)
{
// Progress 2: Report the progress, this will be dealt with by the respective handler (below).
// procFile.ReportProgress((int)(fi.BaseStream.Length / fi.BaseStream.Position) / 100);
fiContents.Append(fi.ReadLine);
}
}
ev.Result = fiContents;
}
/* Progress 3: The handler below will take care of updating the progress of the file as it's processed.
procFile.ProgressChanged += new ProgressChangedEventHandler((object obj, ProgressChangedEventArgs ev) =>
{
// Progress 4: Do something with the value, such as update a ProgressBar.
// ....
}
*/
procFile.RunWorkerCompleted += new RunWorkerCompletedEventHandler((object obj, RunWorkerCompletedEventArgs ev) =>
{
// Do something with the result (ev.Result), bearing in mind, it is a StringBuilder and the ev.Result is an object.
StringBuilder result = ev.Result as StringBuilder;
// ....
}
}
Run Code Online (Sandbox Code Playgroud)
+++++++++++++++++++++++++++++++++++
实际问题的时间......上面是一个热身,并显示当前的理解水平,所以我不会将这些作为预期答案.
我正在做上面给出的最后一个代码示例(即使用a BackgroundWorker)并将读取的内容转储到a RichTextBox.简单的东西真的.
然而,我面临的问题是处理大文件(例如~222MB).这个案子只是拿了一个.txt,读取它,把它的结果推进StringBuilder到了RichTextBox.它无法加载文件,我得到了OutOfMemoryException.解决这个问题的一种方法是花费相当多的时间(并且仍然不加载文件),迭代字符串并char从文件中添加每个字符(作为a )StringBuilder.
我总是使用最基本和最直接的方式来阅读文件(例如上面给出的例子),但有没有人对如何改进这方面有任何指导?处理超大文件的方法?等等
即使作为讨论作品,我也欢迎你的想法.
+++++++++++++++++++++++++++++++++++
编辑1(@TaW):试图把当异常被抛出string进RichTextBox...
FileProcessing.RunWorkerCompleted += new RunWorkerCompletedEventArgs((object obj, RunWorkerCompletedEventArgs e) =>
{
// 'Code' is the RichTextBox in question...
Code.Text = "";
if (e.Result is StringBuilder)
{
Code.Text = (e.Result as StringBuilder).ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |