C#
최신 C# 기능
C# 11
C# 11 새기능
C# 11: Raw String Literal
C# 11: 문자열 내삽 복수라인
C# 11: u8 접미어
C# 11: Generic Math 지원
C# 11: Generic Attribute
C# 11: 리스트 패턴
C# 11: 파일 로컬 타입
C# 11: required modifier
C# 11: Auto-default struct
C# 11: ReadOnlySpan 패턴 매칭
C# 11: 확장된 nameof 범위
C# 11: nint, nuint
C# 11: ref 필드
C# 11: 소문자 타입명 경고
C# 11: 향상된 method group 변환
C# 10
VS 2022 설치
C# 10 global using
C# 10 File-scoped Namespace
C# 10 향상된 문자열 내삽
C# 10 향상된 람다식 유추
C# 10 struct 기능 향상
C# 10 record struct
C# 10 확장된 속성패턴
C# 10 향상된 명료한 할당
C# 10 Destructor 기능 개선
C# 9.0
C# 9 레코드 타입
C# 9 init accessor
C# 9 최상위 프로그램
C# 9 향상된 패턴 매칭
C# 9 향상된 Target Typing
C# 9 공변 리턴 타입
C# 9 Native Int 타입
C# 8.0
C# 8 디폴트 인터페이스 멤버
C# 8 패턴 매칭
C# 8 Nullable Reference Type
C# 8 인덱싱과 슬라이싱
C# 8 비동기 스트림
C# 8 using 선언
C# 8 널 병합 할당자
C# 8 구조체 읽기 전용 멤버
C# 8 기타 기능들
C# 7.0
C# 7.0 새기능
C# 7.0 패턴 매칭
C# 7.0 튜플
C# 7.0 로컬 함수
C# 7.0 out 파라미터
C# 7.0 리터럴 표현
C# 7.0 Deconstructor
C# 7.0 ref return
C# 7.0 async 리턴타입
C# 7.0 Expression-bodied
C# 7.0 throw expression
C# 6.0
C# 6.0 새기능
C# 6.0 널 조건 연산자
C# 6.0 문자열 내삽
C# 6.0 Dictionary초기자
C# 6.0 nameof 연산자
C# 6.0 using static문
C# 6.0 catch블럭 await
C# 6.0 Exception 필터
C# 6.0 자동 속성 초기자
C# 6.0 읽기전용 자동 속성
C# 6.0 Expression-bodied

C#으로 이해하는 자료구조
C# 프로그래밍 기초 실습 전자책
C# 8 : 비동기 스트림

C# 5.0에서 소개된 async/await는 비동기적인 방식으로 결과를 리턴받는 기능을 쉽게 구현하도록 하였다. 이러한 async/await 기능은 결과를 한번 리턴받는 기능으로서, 연속적으로 여러 결과들을 가져오지는 않았다. 하지만, 요즘 클라우드나 IoT와 같은 데이타 소스에서 스트림을 연속적으로 가져오는 경우가 있는데, 이에 C# 8.0에서는 비동기적으로 여러 개의 연속적인 결과 스트림을 가져올 수 있는 기능을 추가하게 되었다.

C# 8.0에서 여러 결과를 비동기적으로 리턴하기 위해 IAsyncEnumerable<T> 인터페이스를 추가하였으며, 비동기 결과들을 비동기적으로 받기위해서 await foreach 라는 키워드를 도입하였다. 즉, foreach 앞에 await를 쓰면, 비동기적으로 결과들을 가져와 처리할 수 있게 한 것이다.

아래 예제에서 Device.GetTemperatures() 메서드는 연속적인 스트림 데이타를 비동기로 전달하는 메서드로서 디바이스에서 온도를 가져와서 온도 변화가 있을 때만 결과를 리턴하게 된다. 무제한으로 결과를 리턴할 수 있지만, 여기 예제에서는 100개의 데이타만 리턴하도록 하였다. 다음 TempTest() 메서드에서는 GetTemperatures() 메서드를 호출하여 비동기로 결과를 받아와서 출력하게 되는데, 여기서 foreach 앞에 await가 있는 점에 주목해야 한다. 즉, IAsyncEnumerable 을 사용하여 비동기 스트림 데이타를 받아오기 위해서는 await foreach를 사용해야 한다.


예제

class Device
{
    private int lastTemp = 0;

    public async IAsyncEnumerable<int> GetTemperatures()
    {
        for(int i=0; i<100; i++)
        {
            int currTemp = await GetTempFromDevice();
            if (currTemp != lastTemp)
            {
                lastTemp = currTemp;
                yield return lastTemp;
            }
        }
    }

    // private async Task<int> GetTempFromDevice() {...}
}


static void Main(string[] args)
{
    TempTest().Wait();
}

static async Task TempTest()
{
    var dev = new Device();
    await foreach (var temp in dev.GetTemperatures())
    {
        Console.WriteLine($"{DateTime.Now}: {temp}");
    }
}




본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.




Comment nanenchanga2@*** 10/19/2020 6:18:20 AM