18.1. 파일과 폴더를 다루는 방법
- File
: 저장 매체에 기록되는 데이터의 묶음
- Directory(Folder)
: 파일이 위치하는 주소
- System.IO 의 클래스
- 주요 메소드와 프로퍼티
18.2. 파일의 "내용"을 읽고 쓰는 방법
- Stream
: 네트워크나 데이터 백업 장치의 데이터 입/출력 구조
: 순차 접근 구조
- System.IO.Stream
: 추상 클래스
- C# CLR Byte Order
: Little Endian (vs. Java JVM: Big Endian)
18.3. using
: 네임스페이스, 파일, 소켓 등
- UsingDeclaration
: 별칭
- 자동 Dispose()
18.4. BinaryWriter/BinaryReader
: 스트림에 이진 데이터를 기록하고읽어 들이기 위한 목적
: BianryWriter + FileStream = BinaryWriter
: BianryWriter + FileStream + Network
18.5. StreamWriter/StreamReader
: 텍스트 파일을 쓰고 읽기
18.6. Serialization(직렬화)
: 객체의 상태를 메모리나 영구 저장 장치에 저장이 가능한 0과 1의 순서로 바꾸는 것
: Binary(이진), JSON(JavaScript Object Notation), XML 형식 직렬화
: [Serializable] 애트리뷰트를 클래스 선언부 앞에 붙이면 메모리나 영구 저장 장치에 저장할 수 있는 형식
19. Thread
19.1. 요약
- Process: 실행 파일이 실행되어 메모리에 적재된 인스턴스
- Thread: 운영체제가 CPU 시간을 할당하는 기본 단위
- Thread 약자: thd
- Synchronous vs. Asynchronous
Eng. | Exp. | call back timing | Kor. | HanJa |
Synchronous | 동시에 발생함 | 함수 호출이 끝난 직후 | 동기화 | 同 한가지 동 期 기약할 기 化 될 화 |
Asynchronous | 동시에 발생하지 않음 | 임의의 타이밍 | 비동기화 | 非 아닐 비 |
- Thread 클래스
: public delegate void ThreadStart();
: public delegate void ParameterizedThreadStart(object obj);
- ThreadPool 클래스
: 리턴 값이 필요 없는 경우
: .NET 4.0 32bit 1023개, 64bit 32768개
- 비동기 델리게이트 (Asynchronous Delegate)
: 리턴값이 필요한 경우
: BeginInvoke(), IAsyncResult, EndInvoke()\
- BackgroundWorker 클래스
: 이벤트를 기반 비동기 처리
- Task Parallel Library(TPL)
: .NET 4.0
: Task, Parallel 관련 클래스
: 다중 CPU 병렬 처리 기반
- Task 클래스
: ThreadPool.QueueUserWorkItem()과 같이 리턴값 필요 없는 경우
- Task<T> 클래스
: T는 리턴 타입을 Result 속성으로 참조
: 쓰레드가 실행 중이면, 결과까지 해당 쓰레드 완료 대기
- Parallel 클래스
: Parallel Framework (PFX)
: 병렬 프로그래밍: 큰 작업 분할 -> 분할된 작업 병렬 실행 -> 결과 집계
(1) Data Parallelism = PLINQ (Parallel LINQ) + Parallel 클래스 (For/Foreach 메서드)
(2) Task Parallelism = Task, TaskFactory (Parallel.Invoke()는 Task Parallelism을 지원)
19.1. Thread
19.2. Thread 강제 종료
- Thread.Abort( )
- 프로세스 내의 스레드는 즉시 종료되지 않는다.
: Thread 객체에 Abort ( ) 메소드를 호출하면 CLR은 해당 스레드가 실행 중이던 코드에 ThreadAbortException을 던집니다.
: 이때 이 예외를 catch가 있으면 처리한 다음, finally 블록까지 실행한 후 스레드가 완전히 종료된다.
:Abort ( ) 메소드를 goto 문만큼 신중하게 사용 (쓰지마라)
19.3. ThreadState
- 비트 연산을 통해 ThreadState가 어떤 상태에 있는지 쉽 게 알아낼 수 있다
19.4. Thread.Interrupt()
- 스레드 Running 상태를 피해서 WaitJoinSleep 상태에 들어갔을 때 ThreadInterruptedException 예외를 던져 스레드를 중지
- 최소한 코드가 “절대로 중단되면 안 되는” 작업을 하고 있을 때는 중단되지 않음 보장
19.5. Thread Synchronization - Lock, Monitor
: 자원을 한 번에 하나의 스레드가 사용하도록 보장”하는 것
- Critical Section(크리티컬 섹션): 한 번에 한 스레드만 사용할 수 있는 장치
- lock( ) = Monitor.Enter( ) + Monitor.Exit( )
19.6. Monitor.Wait( )와 Monitor.Pulse( )
- lock 대신 Monitor 를 사용해야 한다면, Wait( ) 와 Pulse( ) 메소드 영향이 크다
19.7. Task 클래스
19.8. Task<T> 클래스
19.8. Task 작업 종료
https://www.csharpstudy.com/Threads/taskOfT.aspx
19.9. Parallel
Parallel.For()와 Parallel.ForEach() 메서드를 통해 다중 CPU에서 다중 쓰레드가 병렬로 데이타를 분할하여 처리
- 순차처리 vs Parallel 병렬처리
- Parallel.Invoke()
19.7. 병렬 처리와 비동기 처리
: 여러 개의 코어가 동시에 작업을 수행할 수 있도록 하는 병렬 처리, 비동기 처리 기법
- 병렬 처리
: 하나의 작업을 여러개로 나눠서 처리
- Synchronous(동기)
: 작업이 호출되면, 실행 완료가 확인(반환)되어야 다음 작업 호출
: “Shoot And Forget”
- Asynchronous(비동기)
: 여러 작업의 완료를 대기하지 않고, 다음 동작 수행
- System.Threading.Tasks
: 네임스페이스의 클래스들은 하나의 작업을 쪼개 동시에 처리하는 코드와 비동기 코드를 위해 설계
: Task, Task<TResult>, Parallel
: async, await
- Thread 클래스
: 여러 개의 작업을 (나누지 않고) 각각 처리해야 하는 코드에 적합
- Task
: Task 클래스는 인스턴스를 생성시, Action 대리자(반환형 없는 메소드, 익명 메소드, 무명 함수 등)을 넘겨받는다
- Task<TResult>
: 비동기 실행 결과를 손쉽게 취합
: Task가 비동기로 수행할 코드를 Action 대리자로 받는 대신 Func 대리자로 받는다
- Task, Task<TResult>, Parallel
: 메소드를 병렬로 호출할 때 몇 개의 스레드를 사용할지는 Parallel 클래스가 내부적으로 판단하여 최적화
- async, await 한정자
: 호출 결과를 기다리지 않고 바로 다음 코드로 이동하도록 실행 코드를 생성
: await 연산자를 만나는 곳에서 호출자에게 제어를 돌려주며, await 연산자가 없는 경우 동기로 실행된다
19.8. .NET이 제공하는 비동기 API