... | @@ -1138,8 +1138,8 @@ class PathEx |
... | @@ -1138,8 +1138,8 @@ class PathEx |
|
string newDirName = "my?new"; //폴더명에 ? 들어갈 수 없음.
|
|
string newDirName = "my?new"; //폴더명에 ? 들어갈 수 없음.
|
|
|
|
|
|
int include = newDirName.IndexOfAny(Path.GetInvalidFileNameChars());
|
|
int include = newDirName.IndexOfAny(Path.GetInvalidFileNameChars());
|
|
//GetInvalidFileNameChars는 디렉터리 명에 포함되면 안되는 문자들의 배열
|
|
//GetInvalidFileNameChars는 파일명에 포함되면 안되는 문자들의 배열
|
|
//그 배열이 문자들이 새로 만들 폴더명에 포함되지 않으면 IndexOfAny() 메서드가 -1를 리턴. 그 외 숫자가 리턴되면 포함되있다는 뜻
|
|
//그 배열이 문자들이 새로 만들 디렉토리명에 포함되지 않으면 IndexOfAny() 메서드가 -1를 리턴. 그 외 숫자가 리턴되면 포함되있다는 뜻
|
|
if (include != -1)
|
|
if (include != -1)
|
|
{
|
|
{
|
|
Console.WriteLine("폴더명에 적합하지 않은 문자가 있음");
|
|
Console.WriteLine("폴더명에 적합하지 않은 문자가 있음");
|
... | @@ -1176,8 +1176,8 @@ class TreadEx |
... | @@ -1176,8 +1176,8 @@ class TreadEx |
|
Thread t = new Thread(ThreadFunc); //스레드에 실행될 메서드 이름(대리자)를 집어넣는다.
|
|
Thread t = new Thread(ThreadFunc); //스레드에 실행될 메서드 이름(대리자)를 집어넣는다.
|
|
//t라는 스레드는 시작되면 ThreadFunc를 실행한다.
|
|
//t라는 스레드는 시작되면 ThreadFunc를 실행한다.
|
|
|
|
|
|
t.IsBackground = true;
|
|
t.IsBackground = true; //배경스레드로 설정.
|
|
//t가 배경스레드가 되면 ThreadFunc로 넘어가기 전에(엄밀히 말하면 넘어가는 동안) Main() 함수가 끝나고 프로세스가 종료된다.
|
|
//t를 배경스레드로 설정하면 ThreadFunc로 넘어가기 전에(엄밀히 말하면 넘어가는 동안) Main() 함수가 끝나고 프로세스가 종료된다.
|
|
//t 스레드가 운영체제의 스케쥴러에 선택되기 전에 주 스레드가 종료되었기 때문에 이런 현상이 발생한다.
|
|
//t 스레드가 운영체제의 스케쥴러에 선택되기 전에 주 스레드가 종료되었기 때문에 이런 현상이 발생한다.
|
|
//배경 스레드는 실행종료에 영향을 미치지 않는다. 그렇기 때문에 주 스레드가 종료되면 프로세스가 종료된다.
|
|
//배경 스레드는 실행종료에 영향을 미치지 않는다. 그렇기 때문에 주 스레드가 종료되면 프로세스가 종료된다.
|
|
//실행 종료에 영향을 미치는 것은 전경 스레드(foreground thread)이다.
|
|
//실행 종료에 영향을 미치는 것은 전경 스레드(foreground thread)이다.
|
... | @@ -1191,7 +1191,7 @@ class TreadEx |
... | @@ -1191,7 +1191,7 @@ class TreadEx |
|
static void ThreadFunc()
|
|
static void ThreadFunc()
|
|
{
|
|
{
|
|
Console.WriteLine("ThreadFunc가 동작합니다!");
|
|
Console.WriteLine("ThreadFunc가 동작합니다!");
|
|
//이 명령어가 끝나면 t 스레드 종료. 실행중인 스레드가 하나라도 있으면 프로세스는 종료되지 않는다.
|
|
//이 명령어가 끝나면 t 스레드 종료. 실행중인 스레드가 있으면 프로세스는 종료되지 않는다.
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
```
|
... | @@ -1647,7 +1647,7 @@ class AsyncCallEx1 |
... | @@ -1647,7 +1647,7 @@ class AsyncCallEx1 |
|
FileState state = ar.AsyncState as FileState; //state로 전달된 객체를 형변환을 통해 받을 수 있다.
|
|
FileState state = ar.AsyncState as FileState; //state로 전달된 객체를 형변환을 통해 받을 수 있다.
|
|
|
|
|
|
state.file.EndRead(ar); //비동기 읽기 작업이 끝나기를 기다린다. BeginRead를 썼으면 꼭 써줘야한다.
|
|
state.file.EndRead(ar); //비동기 읽기 작업이 끝나기를 기다린다. BeginRead를 썼으면 꼭 써줘야한다.
|
|
//그렇지 않으면 교착 상태 같이 원치 않는 동작이 발생할 수 있다.
|
|
//그렇지 않으면 교착상태와 같은 원치 않는 동작이 발생할 수 있다.
|
|
|
|
|
|
string txt = Encoding.UTF8.GetString(state.buffer);
|
|
string txt = Encoding.UTF8.GetString(state.buffer);
|
|
Console.WriteLine(txt); //"test.log"에 있던 문자열들이 출력된다.
|
|
Console.WriteLine(txt); //"test.log"에 있던 문자열들이 출력된다.
|
... | @@ -1658,12 +1658,12 @@ class AsyncCallEx1 |
... | @@ -1658,12 +1658,12 @@ class AsyncCallEx1 |
|
ThreadPool의 QueueUserWorkItem과 비교해서 비동기 호출로 얻는 이득은 크지 않다. 게임이나 웹 서버 등 동시 접속자 수가 많은 곳에서 유효하게 쓰인다.
|
|
ThreadPool의 QueueUserWorkItem과 비교해서 비동기 호출로 얻는 이득은 크지 않다. 게임이나 웹 서버 등 동시 접속자 수가 많은 곳에서 유효하게 쓰인다.
|
|
|
|
|
|
### Delegate의 비동기 호출
|
|
### Delegate의 비동기 호출
|
|
비동기 호출은 입출력 장치와의 속도 차이에서 오는 비효율적인 스레드 사용 문제를 해결하는데 사용한다. 또한, 닷넷에서는 일반 메서드에 대해서도 비동기 호출을 할 수 있는 수단을 제공하는데, 델리게이트가 그 역할을 한다.
|
|
닷넷에서는 일반 메서드에 대해서도 비동기 호출을 할 수 있는 수단을 제공하는데, 델리게이트가 그 역할을 한다.
|
|
|
|
|
|
델리게이트의 비동기 호출 실행을 스레드 풀에서 하는 예제이다.
|
|
델리게이트의 비동기 호출 실행을 스레드 풀에서 하는 예제이다.
|
|
|
|
|
|
```c#
|
|
```c#
|
|
class DelegateAsyncCallEx1 //델리게이트의 비동기 호출 실행을 스레드 풀에서 하는 예제.
|
|
class DelegateAsyncCallEx1 //델리게이트를 이용한 비동기 호출 예제.
|
|
{
|
|
{
|
|
public delegate long CalcMethod(int start, int end);
|
|
public delegate long CalcMethod(int start, int end);
|
|
//Cumsum 메서드를 받을 수 있는 델리게이트 선언.
|
|
//Cumsum 메서드를 받을 수 있는 델리게이트 선언.
|
... | | ... | |