비동기 파일 입력 및 출력 구현

완료됨

파일 입력 및 출력 작업은 많은 애플리케이션에서 필수이므로 하드 드라이브의 파일에서 읽고 쓸 수 있습니다. C#에서는 파일 입력 및 출력(파일 I/O)을 동기적으로 또는 비동기적으로 수행할 수 있습니다. 비동기 파일 I/O는 특히 큰 파일을 읽거나 하드 드라이브에 데이터를 쓰는 것과 같이 파일 작업에 상당한 시간이 걸릴 수 있는 시나리오에서 애플리케이션 성능 및 응답성을 향상시키는 데 특히 유용합니다.

파일을 읽고 쓰기 위한 비동기 메서드 만들기

async C#의 키워드를 await 사용하면 주 스레드를 차단하지 않고 파일 I/O 작업을 수행할 수 있는 비동기 메서드를 만들 수 있습니다. 이는 주 스레드를 차단하면 고정되거나 응답하지 않는 UI로 이어질 수 있는 사용자 인터페이스가 있는 애플리케이션에서 특히 유용합니다. 및 System.IO 네임스페이 System.Text.Json 스는 파일 I/O 작업을 비동기적으로 수행하기 위한 클래스와 메서드를 제공합니다.

예를 들어 네임스페이 FileSystem.IO 스의 클래스는 파일을 비동기적으로 읽고 쓰는 메서드를 제공합니다. 메서드는 File.ReadAllTextAsync 파일의 내용을 비동기적으로 읽는 반면 File.WriteAllTextAsync 메서드는 비동기적으로 파일에 텍스트를 씁니다. 이러한 메서드는 비동기 작업을 나타내는 Task<string> 또는 Task를 반환하므로, 호출 스레드를 차단하지 않고 키워드 await를 사용하여 완료될 때까지 기다릴 수 있습니다.

네임스페이스 System.Text.Json에서 JsonSerializer 클래스는 JSON 데이터를 직렬화 및 역직렬화하기 위한 비동기 메서드를 제공합니다. JsonSerializer.SerializeAsync 메서드는 개체를 JSON 문자열로 비동기적으로 직렬화하고, JsonSerializer.DeserializeAsync 메서드는 JSON 문자열을 개체로 비동기적으로 역직렬화합니다. 이러한 메서드는 비동기 작업을 나타내는 Task를 반환합니다.

다음 코드 샘플에서는 C# 개체를 직렬화하고, 파일에 JSON 문자열을 쓰고, 파일 내용을 문자열로 읽고, JSON 문자열을 다시 C# 개체로 역직렬화하는 비동기 메서드를 만드는 방법을 보여 줍니다.


using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

public class Account
{
    public string Name { get; set; }
    public decimal Balance { get; set; }
}

public class Program
{
    public static async Task Main()
    {
        // Combine a directory and file name, then create the directory if it doesn't exist
        string directoryPath = @"C:\TempDir";
        if (!Directory.Exists(directoryPath))
        {
            Directory.CreateDirectory(directoryPath);
        }

        string fileName = "account.json";
        string filePath = Path.Combine(directoryPath, fileName);

        Account account = new Account { Name = "Elize Harmsen", Balance = 1000.00m };

        // Save account data to a file asynchronously
        await SaveAccountDataAsync(filePath, account);

        // Load account data from the file asynchronously
        Account loadedAccount = await LoadAccountDataAsync(filePath);
        Console.WriteLine($"Name: {loadedAccount.Name}, Balance: {loadedAccount.Balance}");
    }

    public static async Task SaveAccountDataAsync(string filePath, Account account)
    {
        string jsonString = JsonSerializer.Serialize(account);
        await File.WriteAllTextAsync(filePath, jsonString);
    }

    public static async Task<Account> LoadAccountDataAsync(string filePath)
    {
        string jsonString = await File.ReadAllTextAsync(filePath);
        return JsonSerializer.Deserialize<Account>(jsonString);
    }
}

이 예제에서 메서드는 SaveAccountDataAsync 개체를 Account JSON 문자열로 직렬화하고 파일에 비동기적으로 씁니다. LoadAccountDataAsync 메서드는 파일에서 JSON 문자열을 비동기적으로 읽고 Account 객체로 다시 역직렬화합니다. 이 메서드는 Main 키워드를 사용하여 이러한 비동기 메서드를 호출하는 await 방법을 보여 줍니다.

이를 통해 애플리케이션은 주 스레드를 차단하지 않고 파일 I/O 작업을 수행하여 성능과 응답성을 향상시킬 수 있습니다. 이 Directory.CreateDirectory 메서드는 파일이 없는 경우 디렉터리를 만들어 파일을 성공적으로 쓸 수 있도록 하는 데 사용됩니다.

요약

이 단원에서는 C#에서 비동기 파일 입력 및 출력 작업을 구현하는 방법을 알아보았습니다. asyncawait 키워드를 사용하여 파일을 읽고 쓰기 위한 비동기 메서드를 만드는 방법을 탐색했습니다. 이러한 기술을 사용하면 파일 I/O 작업을 수행할 때 애플리케이션의 성능과 응답성을 향상시킬 수 있습니다.

핵심 사항

  • C#에서 파일 입력 및 출력 작업을 동기적으로 또는 비동기적으로 수행할 수 있습니다.
  • 비동기 파일 I/O는 애플리케이션 성능 및 응답성을 향상시킵니다.
  • asyncawait 키워드는 파일 I/O 작업에 대한 비동기 메서드를 만드는 데 사용됩니다.
  • System.IO 네임스페이 System.Text.Json 스는 파일 I/O 작업을 비동기적으로 수행하기 위한 클래스와 메서드를 제공합니다.
  • File 클래스와 JsonSerializer 클래스는 제공된 예제에서 비동기 파일 I/O 작업을 보여 주는 데 사용됩니다.