[c#] C# yield 식과 비동기 캐싱
C# 에서 yield
키워드는 컬렉션을 생성하는 데 사용됩니다. yield
키워드를 사용하면 간단하게 이터레이터를 구현할 수 있으며, 코드를 좀 더 간결하고 이해하기 쉽게 만들어줍니다.
C# yield 식
IEnumerable<int> GetNumbers()
{
yield return 1;
yield return 2;
yield return 3;
}
yield
키워드를 사용한 위의 예시에서 GetNumbers
메서드는 IEnumerable<int>
를 반환하며, 호출자는 foreach
루프를 사용하여 각 갑을 순회할 수 있습니다.
비동기 캐싱
비동기 프로그래밍에서 캐싱은 결과를 캐시하여 재사용함으로써 성능을 향상시키는 중요한 기술입니다. C# 7.2부터는 ValueTask
및 ValueTask<T>
와 async
메서드를 사용하여 비동기 메서드의 성능을 개선하는 기능을 지원합니다.
public class DataCache
{
private Dictionary<string, ValueTask<string>> _cache = new Dictionary<string, ValueTask<string>>();
public async ValueTask<string> GetDataAsync(string key)
{
if (_cache.TryGetValue(key, out ValueTask<string> cached))
{
return await cached;
}
else
{
var data = await RetrieveDataFromSourceAsync(key);
_cache[key] = new ValueTask<string>(data);
return data;
}
}
private async Task<string> RetrieveDataFromSourceAsync(string key)
{
// 비동기 작업 수행
}
}
위의 예시에서 DataCache
클래스는 ValueTask
를 사용하여 데이터를 캐싱하고, RetrieveDataFromSourceAsync
메서드는 실제로 데이터를 가져오는 비동기 작업을 수행합니다.
ValueTask
를 사용하여 비동기 결과를 캐싱하면 중복된 비동기 작업을 효율적으로 관리할 수 있으며, 성능 향상에 큰 도움이 될 수 있습니다.
결론
C#의 yield
키워드를 이용하여 이터레이터를 만들고, ValueTask
를 사용하여 비동기 결과를 효율적으로 캐싱함으로써 코드를 간결하게 만들고 성능을 향상시킬 수 있습니다.
참고 자료:
- C# 언어 사양: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/statements#the-yield-statement
- C# 7.2 Release Notes: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-2#more-efficient-yielding-returning-of-value_tasks