고현우
개발 일지
고현우
전체 방문자
오늘
어제
  • 분류 전체보기 (14)
    • Unity (7)
      • 작업 (1)
      • 지식 (6)
    • DirectX (0)
      • 작업 (0)
      • 지식 (0)
    • C# (3)
      • 디자인 패턴 (0)
      • 알고리즘 (1)
      • 자료구조 (0)
      • 지식 (2)
    • C++ (0)
      • 디자인 패턴 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 지식 (0)
    • 필수 지식 (4)
      • 물리 (0)
      • 선형대수학 (0)
      • 셰이더 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 메모리 계층
  • 월드좌표
  • 스크린좌표
  • 래스터라이저
  • 뷰포트좌표
  • 선형 탐색 알고리즘
  • 비동기
  • 렌더링파이프라인
  • 로컬좌표
  • 프래그먼트셰이더
  • Y-Up
  • Shader
  • VertexShader
  • Unity
  • 셰이더
  • 버텍스 셰이더
  • Z-Up
  • RenderingPipeline
  • .NET
  • 그래픽스API

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
고현우

개발 일지

[C#] 비동기 프로그래밍(Asynchronous Programming) 에 대해 알아보자
C#/지식

[C#] 비동기 프로그래밍(Asynchronous Programming) 에 대해 알아보자

2022. 1. 9. 19:46

동기, 비동기 프로그래밍

 

동기 프로그래밍(Synchronous Programming)은 프로그램이 실행되는 도중

어떤 작업 요청이 들어오면 해당 작업이 종료될 때까지 기다렸다가 다음

작업을 하는 것을 의미 하고

 

반면 비동기 프로그래밍(Asynchronous Programming)은 프로그램이 실행 되는 도중

작업 요청을 한 뒤 결과를 기다리지 않고 바로 다음 동작을 하는 것을 의미한다.

 

https://adrianmejia.com/asynchronous-vs-synchronous-handling-concurrency-in-javascript/

이처럼 동기(Synchronous)는 작업의 응답이 끝남과 동시에 다음 작업이

요청되고 함수가 결과를 반환 할 때까지 기다리며 작업 완료 여부를

계속 해서 확인한다

 

비동기(Asynchronous)는 작업 완료 여부를 확인하지 않고 작업의 응답이

끝나지 않는 상태에서 다음 작업이 요청된다.

 


Task 클래스

 

하나의 프로그램(프로세스)에는 하나의 스레드를 가지고 작업을 수행한다

다만 멀티 스레드(Multi Thread)는 하나의 프로세스에서도 둘 이상의

스레드가 동시에 작업을 수행하는 것을 의미한다.

 

이처럼 Task 클래스는 멀티 스레드를 지원하여 비동기 작업을

손쉽게 수행 할 수 있다.

 

먼저 task 관련 클래스들을 사용하기 위해

using 선언문을 작성한다.

 

더보기

using System.Threading.Tasks;

 

Task를 사용하여 호출하는 방식은 람다식, Action, 대리자 등 다양하다

using System;
using System.Threading;
using System.Threading.Tasks;

namespace CSharpPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            Task task = new Task(() => PrintHello());
            task.Start();
            Task task2 = new Task(() => PrintHello());
            task2.Start();

            task.Wait();
            task2.Wait();
        }

        static void PrintHello()
        {
            Console.WriteLine("Hello");
        }
    }
}
Task 메서드 설명
Start Task 스레드 시작
Wait Task 끝날 때까지 대기

 


Task<T> 제네릭

 

여기서 Task 클래스에 제네릭을 쓰면 반환 값을 받을 수 있다.

Result라는 속성으로 반환값을 얻을 수 있다

 

using System;
using System.Threading.Tasks;

namespace CSharpPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            Task<int> task = Task.Factory.StartNew(() => Sum(1, 2));
            int sum = task.Result;
            Console.WriteLine(sum);
        }

        static int Sum(int a, int b)
        {
            return a + b;
        }
    }
}

 


Async, Await in Unity

 

C# 5.0부터 추가된 키워드인 async, await 는 비동기 프로그래밍을

지원하고 async는 해당 메서드가 await 키워드를 가지고 있음을 알린다.

 

using UnityEngine;
using System.Threading;
using System.Threading.Tasks;

public class MultiThread : MonoBehaviour
{
    void Start()
    {
        TaskRun();
        TaskFromResult();
    }

    private async void TaskRun()
    {
        Task<int> task = Task.Run(() => TaskRunMethod(3));
        await task;
        Debug.Log(task.Result);
    }

    private int TaskRunMethod(int count)
    {
        int num = 0;

        for(int i = 0; i < count; ++i)
        {
            Thread.Sleep(1000);
            num++;
        }

        return num;
    }

    private async void TaskFromResult()
    {
        int num = await Task.FromResult(TaskFromResultMethod(1, 2));
        Debug.Log(num);
    }

    private int TaskFromResultMethod(int a, int b)
    {
        Thread.Sleep(2000);
        return a + b;
    }
}

1초 뒤 TaskRun 함수에서 호출된 3출력

2초 뒤 TaskFromResult 함수에서 호출된 3출력

 


레퍼런스 사이트

 

https://docs.microsoft.com/ko-kr/dotnet/standard/threading/threads-and-threading

 

스레드 및 스레딩

프로세스와 스레드, 다중 스레드 사용 시기, 다중 스레딩을 사용해 .NET의 응답성이나 처리량을 높이는 방법을 포함하여 스레딩에 대해 알아봅니다.

docs.microsoft.com

저작자표시 (새창열림)

'C# > 지식' 카테고리의 다른 글

[C#] 가비지 컬렉션(Garbage Collection) 에 대해 알아보자  (0) 2022.01.03
    'C#/지식' 카테고리의 다른 글
    • [C#] 가비지 컬렉션(Garbage Collection) 에 대해 알아보자
    고현우
    고현우
    Unity / DirectX 게임 개발

    티스토리툴바