是否有.net 4.0替代StreamReader.ReadLineAsync

本文关键字:替代 StreamReader ReadLineAsync net 是否 | 更新日期: 2023-09-27 18:15:57

我在一个项目中遇到了。net 4.0。StreamReader没有提供Async或开始/结束版本的ReadLine。底层流对象有BeginRead/BeginEnd,但它们采用字节数组,所以我必须实现逐行读取的逻辑。

在4.0框架中有什么可以实现这一点吗?

是否有.net 4.0替代StreamReader.ReadLineAsync

您可以使用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的其他怪异之处。