c# - 异步读取文件的正确方法

标签 c# asynchronous async-await console task

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

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

谢谢。

最佳答案

System.IO提供 File.ReadAllTextAsync .Net Standard 的方法> 2.1 和 .NET Core 2.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);
}

不幸的是,如果您没有使用 C# 7.1或更高,则不能使用 Async主要的。您必须使用 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);
 }

如果您正在使用 .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();  
     }  
}  

关于c# - 异步读取文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59700704/

相关文章:

c# - 编译器找不到命名空间 'System.Windows.Interop'

c# - 如何在 C# 中捕获等待的异步方法的异常?

c# - 多少异步/等待是可以的?

c# - 主线程迭代之间的资源锁定(异步/等待)

.net - WCF 3.5,异步桥接。包裹在 async-await 中

c# - 在 EntityframeworkCore 中使用 async/await 的最佳方法

c# - c#中的继承和c#中的对象创建

c# - 如何将附加参数传递给 Blob 触发函数

c# - SQL Server 安全通信

ios - Swift 函数从异步 firebase 调用返回值