StreamReader.ReadLineAsync是否有.NET 4.0替代品?

时间:2016-11-02 21:47:07

标签: c# .net async-await

我在项目上遇到了.NET 4.0。 StreamReader不提供ReadLine的Async或Begin / End版本。底层的Stream对象有BeginRead / BeginEnd,但是它们采用一个字节数组,所以我必须逐行实现逻辑。

4.0 Framework中有什么东西可以实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

您可以使用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();
    }

答案 1 :(得分:0)

您可以使用任务并行库(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的其他问题。