목록C#/동시성 처리 (13)
방프리
1. 닷넷 이벤트 변환 - FromEventPattern을 통해 범용적인 이벤트를 사용 - EventPattern을 선언할 때 강력하게 할 것인가? 혹은 강력한 데이터를 포기할 것인가 //강력한 데이터를 가져올 때 var timer = new System.Timers.Timer(interval: 1000) { Enabled = true }; IObservable ticks = Observable.FromEventPattern( handler => (s, a) => handler(s, a), handler => timer.Elapsed += handler, handler => timer.Elapsed -= handler); ticks.Subscribe(data => Console.WriteLine("OnN..
1. 블록 연결 var multiplyBlock = new TransformBlock(item => item * 2); var subtractBlock = new TransformBlock(item => item - 2); //PropagateCompletion 옵션을 통해 연결 대상의 완료 및 오류 알림 여부 확인 var options = new DataflowLinkOptions { PropagateCompletion = true }; multiplyBlock.LinkTo(subtractBlock, options); ... //첫 번째 블록의 완료를 자동으로 두 번째 블록에 전파한다. multiplyBlock.Complete(); await subtractBlock.Completion; 2. 오류 전..
1. 데이터의 병렬처리 - 병렬로 여러 데이터를 반복문을 통해 처리할 때 - 만약 공유하는 변수 혹은 리소스가 있다면 잠금(lock)을 사용해보는 것도 좋다. - 책에서는 ForEach 위주로 설명하였지만 순차처리를 목적으로 한다면 ForEachAsync도 고려해볼만 하다. void RotateMatrices(IEnumerable matrices, float degrees, CancellationToken token) { Parallel.ForEach(matrices, new ParallelOptions { CancellationToken = token }, matrix => matrix.Rotate(degress)); } 2. 병렬 집계 - 병렬 작업이 끝난 후 결과를 집계할 때 int Parallel..
1. 비동기 스트림 생성 - yield return을 사용해서 반환 - 비동기 스트림은 내부적으로 ValueTask를 사용, 취소해야할 경우 CancellationToken을 사용하여 취소 async IAsyncEnumerable GetValuesAsync(HttpClient client) { var offset = 0; const int limit = 10; while (true) { var result = await client.GetStringAsync( $"https://example.com/api/values?offset={offset}&limit={limit}"); string[] valuesOnThisPage = result.Split('\n'); foreach (string value in..
1. 일정 시간동안 정지 - 간단한 딜레이 타임을 주는 정도의 기능 - 시나리오 코드 및 간단한 테스트 용도로 사용한다. (이외 실제 기능 혹은 배포에서는 들어가면 좋지 않은 코드) async Task DelayResult(T result, TimeSpan delay) { await Task.Delay(delay); return result; } // delay를 통한 soft timeout 기능 구현 async Task DownloadStringWithTimeout(HttpClient client, string url) { using var tokenSource= new CancellationTokenSource(TimeSpan.FromSecond(3)); Task downloadTask = clien..