반응형

개발관련/C# 25

IAsyncStateMachine 과 Task

1. Task와 async/awaitasync/await: C#의 async와 await 키워드는 비동기 메서드를 쉽게 작성할 수 있게 해준다. async 키워드를 메서드에 붙이면 컴파일러는 해당 메서드를 상태 머신(state machine)코드로 변환한다. await는 비동기 작업이 완료될 때까지 메서드의 실행을 일시 중단(suspend)하고, 작업이 완료되면 메서드를 재개(resume)한다2. IAsyncStateMachine의 역할상태 머신(State Machine): async 키워드가 붙은 메서드는 내부적으로 컴파일러에 의해 상태 머신 클래스 코드로 변환된다. 이 상태 머신 클래스는 IAsyncStateMachine 인터페이스를 구현한다. 상태 머신는 비동기 작업의 흐름을 관리하며, await ..

개발관련/C# 2024.09.02

Task 사용 시의 흐름

Task 생성 및 시작:Task 객체가 생성되면, 아직 실행되지 않은 상태. 예를 들어, Task.Run() 또는 Task.Factory.StartNew() 메서드를 호출하면 Task가 실행 준비 상태가 된다.Task는 작업 내용을 정의한 delegate(예: Action 또는 Func)를 인자로 받는다.작업 대기열에 추가 (큐잉):Task가 시작되면, 작업은 스레드 풀의 작업 대기열에 큐잉된다.. 이 작업 대기열은 스레드 풀에서 관리하며, 실행 대기 중인 작업들을 순차적으로 처리한다.작업이 큐잉된 후, 스레드 풀은 사용 가능한 스레드를 선택하여 해당 작업을 할당한다.스레드 풀에서 스레드 선택:스레드 풀은 관리되는 스레드 풀 안에서 현재 유휴 상태인 스레드를 사용하거나, 필요에 따라 새로운 스레드를 생성..

개발관련/C# 2024.09.02

클래스 멤버 변수를 가진 구조체

구조체와 클래스는 C#에서 각각 값 타입과 참조 타입으로 다르게 동작한다. 구조체와 클래스의 메모리 기본적인 메모리 할당은 구조체는 스택, 클래스는 항상 힙에 할당이 된다. 아래의 코드를 보면 MyStruct는 MyClass를 멤버 변수로 가지고 있다.구조체의 ReferenceType는 스택에 올라갈까? 그렇지 않다.classInstance는 힙에 할당되고 structInstance는 스택에 할당된다. 구조체의 ReferenceType는 힙에 할당되어 있는 classInstance를 참조하게 된다.public class MyClass{ public int Value { get; set; } public MyClass(int value) { Value = value; }}..

개발관련/C# 2024.08.30

Dictionary 와 HashTable, SortedDictionary 차이

Dictionary와 HashTable은 모두 Key-Value 저장하는 자료구조이다. 몇 가지 차이점이 존재한다.차이점Dictionary :- 제너릭 타입을 사용한다. 키와 값을 명시적으로 지정해야한다.Hashtable- object 타입으로 키와 값을 저장한다.- 타입의 안정성을 제공하지 않음으로 런타임 에러가 발생할 수 있다.- 박싱, 언박싱이 발생 할 수 있다. HashTable의 문제점을 개선한 것이 Dictionary 자료 구조이다. Dictionary 내부 자료 구조는 HashTable을 사용한다.private int FindEntry(TKey key) { if( key == null) { ThrowHelper.ThrowArgumentNullException(Exceptio..

개발관련/C# 2024.08.30

리플렉션(Reflection)과 표현식 트리(Expression Tree)

리플렉션의 MethodInfo.Invoke는 속도가 많이 느리다. 이를 개선하기 위해서는 코드 제너레이터를 통하여 코드를 생성하는 방법과 델리게이트를 이용한 방법이 널리 알려져 있다. method.CreateDelegate를 통하여 MethodInfo.Invoke 사용할 수도 있지만 이 방법은 객체가 생성이 된 후에 초기화가 가능하다. .Net MVC에서 Controller는 표현식 트리(Expression Tree) 라는 것을 사용하여 리플렉션의 느린 속도를 개선하였다. 표현식 트리는 코드의 구조와 동작을 표현하는 데이터 구조이다. 주로 코드의 구문 분석, 변환, 또는 표현을 위해 사용된다. Expression.Parameter: 메서드나 생성자에서 사용될 파라미터를 정의한다. Expression.Ca..

개발관련/C# 2023.10.15

System.IO.Pipelines

System.IO.Pipelines 는 .NET에서 고성능 I/O 를 더 쉽게 수행할 수 있도록 설계된 라이브러리이다. Kestrel 을 업계에서 가장 빠른 웹 서버 중 하나로 만들기 위해 수행한 작업에서 탄생했다. 웹 소켓 라이브러리인 SignalR 에도 포함이 되어있고 네트워크단에서 처리를 하는 SDK에는 포함이 대부분 되어 있는 것 같다. 해당 벤치마크에서 확인이 가능하다. https://www.techempower.com/benchmarks/#section=data-r21&hw=ph&test=plaintext TechEmpower Framework Benchmarks www.techempower.com 소켓 버퍼로부터 유저 어플리케이션단으로 데이터를 가져오기 위해 해당 버퍼 만큼의 메모리를 할당하..

개발관련/C# 2023.02.08

Thread Synchronization spinlock vs lock performance

//spin lock public void Add(T item) { bool locked = false; _spinLock.Enter(ref locked); _vector.Add(item); _spinLock.Exit(); } //lock public void Add(T item) { lock(this.SyncRoot) { _vector.Add(item); } } 사용가능한 쓰레드를 모두 사용했을때 결과 lock을 사용한 결과 2.310, 1.876 ms spin lock을 사용한 결과 47.241 ms, 62.261ms public class Benchmark { [Benchmark] public void ThreadSpinLock() { Kosher.Collections.SynchronizedVect..

개발관련/C# 2022.12.20

.net core 패킷 데이터가 30K 바이트보다 큰 경우 디스크에 저장

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.httprequestrewindextensions.enablebuffering?view=aspnetcore-2.2 HttpRequestRewindExtensions.EnableBuffering Method (Microsoft.AspNetCore.Http) Ensure the requestBody can be read multiple times. Normally buffers request bodies in memory; writes requests larger than 30K bytes to disk. docs.microsoft.com 더 큰 요청에 대한 임시 파일은 ASPNETC..

개발관련/C# 2022.04.06

소켓 비정상 종료 처리 TcpKeepAlive

비정상 종료로 인하여 고스트 세션이 발생하였을 때 처리 방법으론 자체적으로 HeartBeat를 만들어 주기적으로 Send를 하거나 소켓 옵션을 통하여 처리하면 된다. window 서버 2010 이상, Window 8.1 이상 지원 C# => IOControl WinSock => WSAIoctl을 사용하면 된다. 소켓을 IOCP에 물렸을 경우 GetQueuedCompletionStatus()에서 False와 ERROR_SEM_TIMEOUT Error로 떨어짐. C# public class TcpKeepAlive{public uint OnOff { get; set; }public uint KeepAliveTime { get; set; }public uint KeepAliveInterval { get; set..

개발관련/C# 2018.09.13

C++/CLI를 통한 C++ 클래스 마샬링

Managed C++/CLI 프로젝트 설정 공용 언어 런타임 지원 code : https://github.com/EomTaeWook/Cpp-CLI-Marshalling Native -> Managed C++/CLI 메시지를 전파를 할시엔 OutGoingMessage를 사용 Managed C++/CLI -> C# event 로 Notify가 나감 C# -> Managed C++/CLI -> Native InCommingMessage으로 사용 Dll Loading을 통한 Runtime Class 생성 예제 Managed C++/CLI CppInterface.h #pragma oncenamespace Cpp{public interface class CppInterface{public:delegate void ..

개발관련/C# 2018.08.11
반응형