본문 바로가기
c#

Task vs TaskValue

by kcj3054 2022. 12. 6.

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