Правильный способ асинхронного чтения файлов - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь читать файлы асинхронно. Мне было интересно, если это правильный способ сделать это. Ниже то, что я пробовал до сих пор. Это правильно?

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;
}

Спасибо.

1 Ответ

1 голос
/ 12 января 2020

System.IO обеспечивает метод File.ReadAllTextAsync для .Net Standard> 2,1 и .NET Core 2.0. Если вы используете C# 7.1 или выше, вы можете использовать File.ReadAllTextAsync внутри основной функции напрямую.

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

К сожалению, если вы не используете C# 7.1 или выше, вы не можете использовать Async Главный. Вы должны использовать Task.Run для вызова asyn c методов.

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);
 }

В случае, если вы используете .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();  
     }  
}  
...