异步读取文件的正确方法

Tra*_*rax 6 c# console asynchronous task async-await

我正在尝试异步读取文件。我想知道这是否是这样做的正确方法。以下是我迄今为止尝试过的。这样对吗?

static void Main(string[] args)
{
     Task<string> readFileTask = Task.Run(() => ReadFile(@"C:\Users\User\Desktop\Test.txt"));
     readFileTask.Wait();
     string astr = readFileTask.Result;
     Console.WriteLine(astr);
}

static private async Task<string> ReadFile(string filePath)
{
     string text = File.ReadAllText(filePath);
     return text;
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

hab*_*bib 7

System.IO提供File.ReadAllTextAsync为方法.Net Standard> 2.1和.NET Core2.0。如果您使用的是 C# 7.1 或更高版本,则可以File.ReadAllTextAsync直接在 Main 函数内部使用。

static async Task Main(string[] args)
{
    var astr = await File.ReadAllTextAsync(@"C:\Users\User\Desktop\Test.txt");
    Console.WriteLine(astr);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果您不使用C# 7.1或更高版本,则不能使用AsyncMain。您必须使用 Task.Run 来调用异步方法。

static void Main(string[] args)
{
    var astr=Task.Run(async () =>
    {
       return await File.ReadAllTextAsync(@"C:\Users\User\Desktop\Test.txt");
    }).GetAwaiter().GetResult();

    Console.WriteLine(astr);
 }
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,.NET Framework那么您必须使用FileStream因为System.IO没有提供File.ReadAllTextAsync方法。

private static async Task<string> ReadAllTextAsync(string filePath)  
{  
    using (FileStream sourceStream = new FileStream(filePath,  
        FileMode.Open, FileAccess.Read, FileShare.Read,  
        bufferSize: 4096, useAsync: true))  
    {  
        StringBuilder sb = new StringBuilder();  

        byte[] buffer = new byte[0x1000];  
        int numRead;  
        while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)  
        {  
            string text = Encoding.Unicode.GetString(buffer, 0, numRead);  
            sb.Append(text);  
        }  

        return sb.ToString();  
     }  
}  
Run Code Online (Sandbox Code Playgroud)