[C#] ClientWebSocket 내부 구현 파헤치기
·
Programming/C# .NET
WebSocket은 ws 프로토콜을 기반으로 클라이언트와 서버 사이에 지속적인 완전 양방향 연결 스트림을 만들어 주는 기술이자 프로토콜이다. WebSocket은 HTTP와 구별된다. 두 프로토콜 모두 OSI 모델의 제7계층에 위치해 있으며 제4계층의 TCP에 의존한다. HTTP polling은 클라이언트가 주기적으로 요청을 보내고 서버가 응답하는 request/response 패턴이라, WebSocket처럼 하나의 연결에서 지속적으로 양방향 메시지를 주고받는 구조와 다르다. WebSocket 연결은 HTTP 기반 handshake로 시작된다.HTTP/1.1에서는 GET + Upgrade 방식으로 연결을 WebSocket 프로토콜로 전환하고,HTTP/2에서는 extended CONNECT 방식으로 WebS..
[C#] HttpClient 내부 구현 파헤치기
·
Programming/C# .NET
HTTP (Hypertext Transfer Protocol) 은 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 애플리케이션 계층 프로토콜이다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트가 요청을 하기 위해 연결을 연 다음 응답을 받을때 까지 대기하는 전통적인 클라이언트-서버 모델을 따른다. 클라이언트와 서버는 개별적인 메시지 교환에 의해 통신한다. 클라이언트에 의해 전송되는 메시지를 요청(requests)이라고 부르며, 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(responses)이라고 부른다. 이 요청과 응답 사이에는 여러 개체들이 있는데, 다양한 작업을 수행하는 게이트웨이, 캐시 역할을 하는 프록시 등이 있다.실제로는 클라이언트와 서버 사이에는 라우터, 모뎀 ..
[C#] LINQ 내부 구현 파헤치기
·
Programming/C# .NET
개념 LINQ(Language-Integrated Query)는 쿼리 기능이 C# 언어에 직접 통합된 것을 기반으로 하는 기술 집합이다.쿼리 구문을 사용하여 최소 코드로 데이터 원본에 대한 필터링, 순서 지정 및 그룹화 작업을 수행한다. public class LinqExample { public IEnumerable GetMyLinq() { string[] names = { "Kim", "Lee", "Park", "Choi", "Jung" }; // Using query expression syntax. IEnumerable query = from name in names where name.Length > 3 selec..
[C#] ref 구조체 Span / stackalloc / ReadOnlySpan
·
Programming/C# .NET
C# 7.2에서는 스택 메모리에서만 생성될 수 있도록 하는 ref 구조체라는 개념이 포함되었다.구조체를 선언할 때 ref 한정자를 사용하면 된다. public ref struct CustomRef { // ...} ref 구조체는 힙 메모리로 저장될 수 없다.즉, 클래스의 필드로 선언하거나, 박싱될 수 없고, 람다 식에서 캡쳐되거나 이터레이터 및 async 메서드에서의 사용에 제한이 있다. 이러한 제약들로 인해 스택 메모리에만 머물게 한다는 보장이 될 수 있고,그로 인해 작업에 추가적인 메모리 할당이나 복사 과정을 생략할 수 있어 성능 개선에 도움이 된다. Span// Span.cspublic readonly ref struct Span { /// A byref or a native ptr...
[C#] 이터레이터 이해하기 IEnumerable / IEnumerator
·
Programming/C# .NET
이터레이터란, yield return이나 yield break 문을 사용하는 이터레이터 블록을 포함하는 메서드나 속성을 말한다.다음 중 하나를 반환 타입으로하는 메서드나 속성을 구현할 때만 사용할 수 있다. IEnumerableIEnumerableIEnumeratorIEnumerator private static IEnumerable GetExampleIterator() { for (int i = 0; i 결괏값01234 위와 같이 foreach문과 함께 사용하면, 메서드가 반환하는 시퀀스를 순회할 수 있다.위의 코드는 아래의 while 루프로도 표현할 수 있다. private static void Main(string[] args) { IEnumerable enumerable = GetEx..
[C#] 람다 표현식(Lambda Expression) 이해하기
·
Programming/C# .NET
람다 표현식은 코드를 간결하게 표현하기 위한 기능으로 C# 3.0에 도입되었다. 기본 문법은 항상 다음과 같은 모습을 띤다.parameter => body 중괄호가 포함된 경우 문장 본문, 간략하게 한 줄로 쓰는 경우는 표현식 본문이라고 한다. // 문장 본문Func multiplay = (int x, int y) ⇒ { return x * y; };// 표현식 본문Func multiplay = (int x, int y) ⇒ return x * y;Func multiplay = (x, y) ⇒ x * y; 아래의 경우에도 위와 비슷하지만, 매개변수가 1개이기 때문에 매개변수 부분의 소괄호도 생략할 수 있다. Func squareLength = (string text) => { int length = t..
[Unity/C#] UniTask 이해하기 Task, Coroutine과의 차이
·
Programming/C# .NET
UniTask를 이해하기 전에 C#의 async / await, Task, ValueTask, CancellationToken의 이해가 선행되는게 좋다.따라서 이 글에서는 위의 개념들을 간략하게만 짚고 넘어간다. 배경Unity는 기본적으로 코루틴(Coroutine)을 통해 비동기 처리를 제공한다. 다만 이는 아래와 같이 여러 문제점들이 존재한다.1. 시작 시 MonoBehaviour와 결합해야 한다.2. 콜백 프로세스로 반환 값과 예외를 전달하기 어렵다.3. 람다와 코루틴 자체의 할당이 필요하다.4. 취소 처리가 어렵다. 멈출 수는 있지만 사용한 자원 정리가 불가능하다. (finally, dispose 등)5. 다중 코루틴을 직렬, 또는 병렬로 제어하기가 번거롭다. C# 5.0부터 제공된 async ..
[C#] CancellationToken / CancellationTokenSource 작성 및 내부 구현
·
Programming/C# .NET
.Net Framework 4부터 비동기 또는 장기 실행되는 동기 작업의 협조적 취소(Cooperative Cancellation)를 위해 통합 모델을 사용한다. 이 모델은 취소 토큰이라는 경량 개체를 기반으로 한다. 각 작업에 토큰을 전달한다. 일정한 시점에서 토큰을 만든 개체는 각 작업을 멈추도록 요청할 수 있다.토큰을 받은 수신 측은 취소 요청을 확인하고 적절한 방식으로 응답할 책임이 있다. 하지만 가능한 빠르게 정리하고 종료해야 한다.작업이 취소되었을 때 적절한 취소 메커니즘을 구현하지 못한다면 사용자의 만족도를 낮출 수 있고, 메모리 누수나 불필요한 연산 낭비가 일어날 수 있다. 취소 토큰을 사용하는 일반적인 패턴은 아래와 같다.1. CancellationTokenSource를 인스턴스화하여 C..
[C#] ValueTask 이해하기, Task와의 차이점
·
Programming/C# .NET
.NET Framework 4에서 도입된 Task와 Task는 async / await 키워드와 함께 비동기 프로그래밍 모델의 핵심 요소다. 클래스로서의 Task는 매우 유연하며 그에 따른 이점이 있다. 반환된 Task 객체를 동시에, 또는 여러 번 await할 수도 있고, 따로 저장해두어 비동기 결과의 캐시로 사용할 수도 있다. 또한 WhenAny(), WhenAll()과 같이 Task에 대한 다양한 연산을 사용할 수 있다. 하지만 가장 일반적인 경우는 단순히 비동기 작업을 호출하고 그 결과를 await하는 경우이다. 이러한 경우에는 위 같은 유연성이 필요하지 않다. 더 나아가서, Task는 인스턴스가 많이 생성되거나 성능이 중요한 시나리오에서는 잠재적인 단점을 가지고 있다.Task가 클래스이기 때문에..
[C#] 비동기 코드 async / await / Task 작성 및 내부 구현
·
Programming/C# .NET
비동기 코드 작성 C# 5의 핵심 기능으로 기존에 사용하던 TPL을 기반으로한 async / await이 등장했고, 이 기능을 이용하면 동기 코드와 매우 유사한 방식으로 비동기 코드를 작성할 수 있다. 작업이 완료될 때까지 아래에 있는 코드가 수행되지 않는다는 면에서 블로킹 호출과 유사하지만, 현재 수행 중인 스레드를 블로킹하지 않는다는 점에서 큰 차이가 있다. 비동기 함수란, async 한정자를 사용하여 선언한 메서드의 익명 함수를 말하며, await 연산자를 이용하여 '대기' 를 표현할 수 있다.await의 주요 목적은 시간을 많이 소비하는 작업이 완료될 때까지 수행이 중단되는 것을 막는 것이다. public class Program { private static async Task Main(s..