728x90
C#
Async/Await
- C#에서 비동기 프로그래밍을 쉽게 할 수 있게 해주는 키워드이다. 이 두 키워드는 복잡한 비동기 코드를 간결하게 작성할 수 있게 해주며, 동기 코드처럼 읽기 쉽고 유지 보수하기 좋은 코드를 작성할 수 있게 도와준다.
async
- async 키워드는 메서드, 람다식, 또는 익명 메서드에 사용된다.
- 이 키워드는 해당 메서드가 비동기적으로 실행될 것임을 컴파일러에게 알려준다.
- async 메서드는 반드시 await 키워드를 포함하지 않아도 되지만, 포함하는 것이 일반적이다.
await
- await는 비동기 작업이 완료될 때까지 메서드의 실행을 일시 중지하고, 작업이 완료되면 계속 실행한다.
- await 키워드는 비동기 작업이 끝날 대까지 호출된 메서드를 기다렸다가, 그 이후의 코드를 계속 실행한다.
- 중요한 점은 await 키워드는 async 메서드 내에서만 사용할 수 있다.
비동기 프로그래밍의 이점
- 사용자 인터페이스의 응답성 유지
- async와 await는 UI 스레드에서 작업이 오래 걸리는 동안에도 UI가 멈추지 않도록 한다. 예를 들어, 파일 다운로드 중에도 UI는 계속해서 응답할 수 있다.
- 자원 효율성
- 비동기 메서드를 사용하면 I/O 바운드 작업(EX: 파일 읽기, 네트워크 요청)이 완료될 때까지 스레드가 차단되지 않는다. 이는 자원을 더 효율적으로 사용할 수 있게 해준다.
- 코드 가독성
- 기존의 콜백 기반 비동기 프로그래밍에 비해 async/await을 사용한 코드는 더 직관적이고, 동기 코드처럼 읽기 쉽다.
복귀 유형(Return Types)
- async 메서드는 다음과 같은 복귀 유형을 가질 수 있다.
- Task
- 반환 값이 없는 비동기 작업을 나타낸다.
- Task<T>
- 반환 값이 있는 비동기 작업을 나타낸다.
- void
- 주로 이벤트 핸들러에서 사용되며, 호출자는 작업의 완료 여부를 알 수 없다. 따라서 일반적으로 사용을 권장하지 않는다.
- Task
예외 처리
- async 메서드 내에서 예외가 발생하면, 해당 예외는 비동기 작업이 완료된 시점에 호출된 곳에서 await에 의해 던져진다. 즉, 비동기 메서드의 예외 처리는 동기 메서드와 동일하게 try-catch블록으로 처리할 수 있다.
ConcurrentDictionary<TKey, TValue>.GetOrAdd
- C#에서 스레드 안전하게 값을 추가하거나 검색할 수 있게 해주는 메서드이다.
- 이 메서드는 특히 다중 스레드 환경에서 유용하며, 고유한 키를 가진 값이 이미 존재하는지 확인하고, 존재하지 않는 경우에만 새 값을 추가한다.
기본 구조
- ConcurrentDictionary<TKey, TValue>는 키-값 쌍을 저장하는 스레드 안전한 사전(collection)이다. GetOrAdd 메서드는 다음 두 가지 방식으로 사용할 수 있다.
- 기존 값 검색 또는 추가
TValue GetOrAdd(TKey key, TValue value);
- 사전에 주어진 키가 있는지 확인하고, 존재하면 해당 값을 반환한다. 만약 키가 없다면 새로운 값을 추가하고 그 값을 반환한다.
ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>(); // 키가 존재하지 않으면 추가하고, 존재하면 기존 값을 반환 string value = dict.GetOrAdd(1, "First Value");
- 기존 값 검색 또는 생성 후 추가
TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory);
- 제공된 Func<TKey, TValue> 델리게이트를 사용하여 값을 생성한다. 키가 이미 존재하면 해당 값을 반환하고, 키가 없으면 제공된 팩토리 함수를 사용하여 값을 생성한 후 사전에 추가하고 반환한다.
ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>(); // 키가 존재하지 않으면 팩토리 함수를 사용해 값을 생성 후 추가 string value = dict.GetOrAdd(2, key => "Value for " + key);
동작 원리
- 키 존재 확인
- 먼저, 지정된 키가 사전에 이미 존재하는지 확인한다.
- 존재할 경우
- 기존 값을 반환한다.
- 존재하지 않을 경우
- 첫 번째 오버로드에서는 지정된 값을 추가하고 반환한다. 두 번째 오버로드에서는 팩토리 함수가 호출되어 값을 생성하고 사전에 추가한 후 반환한다.
스레드 안전성
- ConcurrentDictionary는 여러 스레드가 동시에 접근하는 경우에도 안전하게 동작할 수 있도록 설계되었다. GetOrAdd 메서드는 내부적으로 원자적(Atomic)으로 작동하여, 두 개 이상의 스레드가 동일한 키에 대해 동시에 GetOrAdd를 호출하더라도 충돌 없이 정확하게 하나의 값만 추가된다.
참조
https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/
DEV
Tree Conflict
- 주로 파일이나 디렉토리의 구조적 변화로 인해 발생하는 충돌이다. 이는 SVN이 병합 작업을 수행할 때, 작업 복사본(Working Copy)에서 파일이나 디렉토리의 추가, 삭제, 이동, 복사 등의 작업이 서로 충돌하는 상황을 처리하지 못하는 경우에 발생한다. 트리 충돌은 SVN의 병합 알고리즘이 파일 내용을 빅교하고 병합하는 것과는 달리, 파일 구조의 변경을 인식하지 못해 발생하는 경우가 많다.
트리 충돌의 주요 원인
- 파일 또는 디렉토리의 이동/삭제 후 변경
- 작업 복사본에서 파일이나 디렉토리를 이동 또는 삭제했지만, 다른 사람이 같은 파일이나 디렉토리를 수정한 경우
- 동일 파일 또는 디렉토리의 삭제 및 추가
- 한 사용자가 파일을 삭제했지만, 다른 사용자가 같은 파일을 추가한 경우
- 디렉토리의 구조적 변경
- 한 사용자가 디렉토리의 구조를 변경(예: 디렉토리 이동 또는 이름 변경)했지만, 다른 사용자가 같은 디렉토리 내에서 파일을 수정한 경우
- 동일 파일 또는 디렉토리의 추가
- 서로 다른 사용자가 동일한 경로에 파일이나 디렉토리를 추가한 경우
트리 충돌 해결 방법
- SVN 상태 확인
- svn status 명령어를 사용하여 트리 충돌을 확인한다. 트리 충돌이 있는 파일이나 디렉토리는 C 상태로 표시된다.
- 트리 충돌 해결
- 수동 병합
- 충돌이 발생한 파일이나 디렉토리를 수동으로 병합한다. 이를 위해 충돌된 변경 사항을 비교하고, 필요한 경우 파일을 이동하거나 이름을 변경한 후 병합한다.
- 삭제 및 재추가
- 필요에 따라 충돌된 파일이나 디렉토리를 삭제한 후 다시 추가하거나, SVN 서버에서 최신 버전을 가져온 후 로컬 변경 사항을 다시 적용한다.
- 충돌 해결 도구 사용
- SVN 클라이언트(EX: TortoiseSVN)의 충돌 해결 도구를 사용하여 충돌된 파일이나 디렉토리를 시각적으로 병합하고 해결할 수 있다.
- 수동 병합
- SVN에 충돌 해결 알라기
- 충돌을 해결한 후 svn resolved 명령어를 사용하여 SVN에 트리 충돌이 해결되었음을 알린다. 이 명령은 SVN에게 충돌이 해결되었음을 알리며, 이후 작업을 계속할 수 있다.
- EX) svn resolved <파일 또는 디렉토리 경로>
- 변경 사항 커밋
- 트리 충돌을 해결한 후, 변경 사항을 다시 커밋한다. 이 과정에서 해결된 충돌 내용이 포함된다.
- EX) svn commit -m ‘트리 충돌 해결 및 변경 사항 커밋’
예방 방법
- 정기적인 업데이트
- 정기적으로 SVN 서버에서 업데이트를 받아 최신 상태를 유지하고, 변경 사항이 많아지기 전에 병합 작업을 수행한다.
- 작업 복사본의 작은 단위 커밋
- 작은 단위로 자주 커밋하여 트리 충돌의 가능성을 줄인다.
- 서로 다른 작업에 대한 커뮤니케이션
- SVN을 사용하는 팀 간의 커뮤니케이션을 통해, 디렉토리 구조 변경 등의 작업에 대해 미리 논의하고 조정한다.
SVN 충돌 해결법
- edit
- 병합된 파일을 편집기로 열기
- diff-full
- 병합된 파일을 보기
- resolved
- 병합된 파일을 채택하기
- display-conflict
- 모든 충돌 사항을 보이기(잘 병합된 부분 제외)
- mine-conflict
- 충돌 부분에 대하여 작업사본을 선택하기
- theirs-conflict
- 충돌 부분에 대하여 저장소본을 선택하기
- mine-full
- 충돌난 파일에 대하여 작업사본 파일을 선택하기
- theirs-full
- 충돌난 파일에 대하여 저장소본 파일을 선택하기
- postpone
- 나중에 해결할 것으로 표시해두기
- launch
- 외부 툴을 실행하여 충돌을 해결
- show all
- 옵션을 모두 출력
참조
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.08.20 CS, 디자인 패턴 (0) | 2024.08.20 |
---|---|
24.08.19 네트워크 (0) | 2024.08.19 |
24.08.14 CS, Dev (0) | 2024.08.14 |
24.08.13 CS, C# (0) | 2024.08.13 |
24.08.12 CS, C# (0) | 2024.08.12 |