목록전체 글 (244)
방프리
1. 변수에서의 auto 사용auto는 지역 변수에 대해 좌에서 우로 초기화하는 방식으로 사용하는 것을 선호 ex) auto i = 0;이동 불가능한 유형이나 복사 불가능한 유형에도 적용 가능2. const 참조const auto&와 같이 나타나는 const 참조는 어느 것과도 바인드가 가능const 참조는 수정을 원하지 않는 변수에 대한 기본적인 선택이어야 함auto func() { auto foo = Foo {}; auto& cref = foo.cref(); // cref는 const 참조 auto& mref = foo.mref(); // mref는 변경 가능한 참조}3. 가변 참조const 참조와 반대로 임시 객체와 바인드가 되지 않음auto&는 가변 참조를 표시하여 사용4. 전달 ..
1. 공유 리소스 초기화공유하는 리소스를 생성할 때가 아닌 처음 사용 시 초기화를 할 때 Lazy형식을 사용한다.게으른 초기화라고도 하는데 팩토리 대리자와 함께 인스턴스를 생성한다.static int _simpleValue;static readonly Lazy MySharedInteger = new Lazy(() => _simpleValue++);void UseSharedInteger(){ int sharedValue = MySharedInteger.Value;}// 비동기 작업 시static int _simpleValue;static readonly Lazy> MySharedAsyncInteger = new Lazy>(() => Task.Run(async () => { a..
1. 스레드 풀에 작업 스케줄링Task.Run을 사용하여 작업을 실행시킨다. 여러 기능이 있으나 Task.Run을 사용하는 것이 유지보수나 변경에 쉽다.Task task = Task.Run(async () =>{ await Task.Delay(TimeSpan.FromSeconds(2)); return 13;}); 2. 작업 스케줄러를 사용해서 코드 실행TaskScheduler 중 TaskScheduler.Default는 작업을 스레드 풀의 큐에 넣는다. Task.Run, 병렬 처리, 데이터 흐름 코드는 모두 TaskScheduler.Default를 사용한다. TaskScheduler.FromCurrentSynchronizationContext를 사용해서 컨텍스트를 저장해놓고 나중에 다시 이 컨..
1. 블로킹 잠금닷넷에서는 여러 기능을 통해 잠금 기법을 제공한다. 다만 대부분의 상황에서의 잠금은 lock으로 처리가 가능하다.단 lock을 사용함에 있어서 네 가지 지침을 확인할 필요가 있다.잠금의 가시성을 제한해야 한다.잠금으로 보호하는 대상을 문서화한다.잠그는 코드를 최소화한다.잠금을 유지하는 동안 절대로 임의의 코드를 실행하지 말아야 한다.class MyClass{ private readonly object _mutex = new object(); private int _value; public void Increment() { lock(_mutex) { _value = _value + 1; } }} 2...
1. 비동기 인터페이스와 상속async 키워드는 구현을 지니는 메서드에서만 적용할 수 있다. 즉, 기본 구현이 없는 추상 메서드나 인터페이스 메서드에는 적용할 수 없다. 하지만 async 키워드가 없어도 async 메서드와 시그니처가 똑같은 메서드를 정의할 순 있지만 대기하는 대상은 메서드가 아닌 형식을 대기하는 것이다.interface IMyAsyncInterface{ Task CountBytesAsync(HttpClient client, string url);}class MyAsyncClass : IMyAsyncInterface{ public async Task CountBytesAsync(HttpClient client, string url) { var bytes = a..
1. 취소 요청 실행CancellationTokenSource 형식은 CancellationToken의 공급원이며 이 형식만 취소 요청에 대응이 가능하다.또한 다른 CancellationTokenSource와 독립적이다. 코드를 취소할 때 거의 항상 경합 조건이 발생한다.void IssueCancelRequest(){ using var cts = new CancellationTokenSource(); var task = CancelableMethodAsync(cts.Token); cts.Cancel();} 2. 폴링으로 취소 요청에 대응함수 안에 처리 루프가 있을 때는 취소 여부를 주기적으로 확인할 수 밖에 없기에 실행속도가 빠르다면 속도를 어느 정도 조절해가며 성능을 측정해야 한..
1. 불변 스택과 불변 큐기본 스택과 큐와 성능을 동일하나 컬렉션을 자주 업데이트를 해야한다면 기본 스택과 큐가 더 빠르다. 단, 사용 시 하단의 내용을 알고 있어야 한다.불변 컬렉션의 인스턴스는 절대 바뀌지 않는다.스레드로부터 안전하다불변 컬렉션을 변경하는 메서드를 호출하면 변경한 내용을 반영한 새로운 컬렉션을 반환한다.스렏드 간 통신에 사용해서는 안된다. 생산자/소비자 큐가 훨씬 좋다. 2. 불변 리스트불변 리스트는 일반적인 List와 달리 불변 리스트의 인스턴스끼리 최대한 많은 메모리를 공유할 수 있게 내부적으로 이진트리로 구현되어 있다. 그러기에 대부분의 소요시간이 O(log N)이기에 foreach를 적극 활용해야 한다.ImmutableList는 그다지 선호되지 않는다. 사용 시 잘 확인해볼 것..
1. 'Async' 메서드와 'Completed' 이벤트용 비동기 래퍼Async로 끝나는 메서드와 Completed로 끝나는 이벤트를 사용하는 패턴을 이벤트 기반 비동기 패턴 (EAP, Event-based Asynchronous Pattern)이라고 한다. 이 EAP가 작업 기반 비동기 패턴 (TAP, Task-based Asynchronuous Pattern)을 따를 수 있게 Task를 반환하는 메서드로 감싸려 한다.public static Task DownloadStringTaskAsync(this WebClient client, Uri address){ var tcs = new TaskCompletionSource(); DownloadStringCompletedEventHa..