Task Vs TaskValue
빈 인스턴스를 반환할 때는 굳이 Task를 써야할까에 대한 것이다.
Task는 참조형이지만, TaskValue는 value형태이다..
TaskValue가 필요한 경우
public class sum
{
private static Dictionary<int, long>_cache = new();
public static Task<long> CalcAsync(int n)
{
if (_cache.ContainsKey(n))
{
return Task.FromResult(_cache[n]);
}
return Task.Factory.StartNew(
() =>
{
long sum = 0;
for (int i = 1; i <= n; ++i)
sum += i;
_cache[n] = sum;
return sum;
}
);
}
}
- cache를 반환하는 경우에도 반환값이 Taks
이라서 빈 task 인스턴스 Task.FromResult를 이용해서 반환을했다. 이러한 불필요하게 heap 메모리를 사용하는 격이다.
TaskValue를 사용한 경우
public class valueTaskSum
{
private static Dictionary<int, long>_cache = new();
public static ValueTask<long> CalcAsync(int n)
{
if (_cache.ContainsKey(n))
{
return new ValueTask<long>(_cache[n]);
}
return new ValueTask<long>(Task.Factory.StartNew(
() =>
{
long sum = 0;
for (int i = 1; i <= n; ++i)
sum += i;
_cache[n] = sum;
return sum;
}
));
}
}
- 이부분에도 단점이 존재한다 cache쪽은 향상되었지만, 아닌 부분에서는 Task를 반환해야하는데 반환 값이 valueTask라서 task를 한번 랩핑하게된다..
'c#' 카테고리의 다른 글
c# 패턴매칭... switch case에 활용.. (0) | 2022.12.06 |
---|---|
Generic, where, using static (0) | 2022.12.06 |
c# (시작하세요 c# 프로그래밍 도서 ) (0) | 2022.12.05 |
추상 vs 인터페이스 (0) | 2022.12.05 |
c#의 init access 문법과 top level (0) | 2022.07.24 |