是否有.net 4.0替代StreamReader.ReadLineAsync
本文关键字:替代 StreamReader ReadLineAsync net 是否 | 更新日期: 2023-09-27 18:15:57
我在一个项目中遇到了。net 4.0。StreamReader没有提供Async或开始/结束版本的ReadLine。底层流对象有BeginRead/BeginEnd,但它们采用字节数组,所以我必须实现逐行读取的逻辑。
在4.0框架中有什么可以实现这一点吗?
您可以使用Task
。你没有指定代码的其他部分,所以我不知道你想做什么。我建议您避免使用Task.Wait
,因为这会阻塞UI线程并等待任务完成,这不是真正的异步!如果您想在任务中读取文件后执行其他操作,可以使用task.ContinueWith
。
这里有一个完整的例子,如何在不阻塞UI线程的情况下完成
static void Main(string[] args)
{
string filePath = @"FILE PATH";
Task<string[]> task = Task.Run<string[]>(() => ReadFile(filePath));
bool stopWhile = false;
//if you want to not block the UI with Task.Wait() for the result
// and you want to perform some other operations with the already read file
Task continueTask = task.ContinueWith((x) => {
string[] result = x.Result; //result of readed file
foreach(var a in result)
{
Console.WriteLine(a);
}
stopWhile = true;
});
//here do other actions not related with the result of the file content
while(!stopWhile)
{
Console.WriteLine("TEST");
}
}
public static string[] ReadFile(string filePath)
{
List<String> lines = new List<String>();
string line = "";
using (StreamReader sr = new StreamReader(filePath))
{
while ((line = sr.ReadLine()) != null)
lines.Add(line);
}
Console.WriteLine("File Readed");
return lines.ToArray();
}
你可以使用任务并行库(TPL)来做一些你想做的异步行为。
将同步方法封装在任务中:
var asyncTask = Task.Run(() => YourMethod(args, ...));
var asyncTask.Wait(); // You can also Task.WaitAll or other methods if you have several of these that you want to run in parallel.
var result = asyncTask.Result;
如果你需要为StreamReader做很多这样的事情,如果你想模拟常规的异步方法,你可以继续把它变成StreamReader的一个扩展方法。只需注意错误处理和使用TPL的其他怪异之处。