Windows 탐색기에서 TFS 사용하기


 SVN이나 Git 관련 툴을 보면 윈도우 탐색기에서 직접 커밋 또는 체크 아웃을 할 수 있다. 그렇지만 TFS는 기본적으로 Visual studio에 포함되어 있는 Team Explorer을 통해서만 컨트롤 할 수 있다. 그동안 TFS를 사용하면서도 윈도우 탐색기에서도 사용할 수 있기를 희망하였었는데 Visual gallery에서는 이전부터 탐색기 연동으로 사용할 수 있는 툴을 공개 하고 있었다.


Microsoft Visual Studio Team Foundation Server 2012 Update 1 Power Tools

http://visualstudiogallery.msdn.microsoft.com/b1ef7eb2-e084-4cb8-9bc7-06c3bad9148f


위 링크로 들어가서 해당 설치 파일을 받아 실행해 보기 바란다.


설치 후 재 부팅하면 아래 그림과 같이 탐색기에서 직접 컨트롤 할 수 있게 된다.



[그림1] TFS와 윈도우 탐색기에서 컨텍스트 메뉴


매핑 제거



TFS를 사용하고 있을 때 어떤 이유에서건 다시 폴더를 매핑해야 하는 사항이 생기기 마련이다. 그런데 다시 매핑을 시도할 때 "이미 매핑되어 있습니다. ... " 와 같은 에러 메세지가 나오면서 매핑이 추가가 안된다. 그럴때는 아래와 같이 캐시폴더에서 수정을 해야 다시 추가할 수 있습니다.



[그림1] 캐시된 폴더 위치


TFS 2012 매핑 캐시 폴더

C:\Users\사용자 폴더\AppData\Local\Microsoft\Team Foundation\4.0\Cache


TFS 2010 매핑 캐시 폴더

C:\Users\사용자 폴더\AppData\Local\Microsoft\Team Foundation\3.0\Cache



 그림 1과 같은 폴더에서 "VersionControl.config"파일의 


1. repositoryGuid  을 현재  Guid로 변경해 주시거나, 매핑하고자 하는 TFS의 정보만 삭제하면 기존의 매핑 정보를 그대로 사용할 수 있다. 


2. 또는 Config 파일에서 <WorkspaceInfo></WorkspaceInfo>의 값을 삭제 후 저장하면 매핑을 추가할 수 있다.


3. 이도 저도 귀찮으면 해당 폴더의 내용을 모두 지우고 다시 매핑을 추가하면 된다. 그렇지만 이렇게 하면 다른 매핑 정보도 같이 없어 질 수 있으니 주의 하기 바란다.

TFSDeleteProject: Deleting Team Projects

 


 TFS 2012 Team Explorer을 통해 만들어진 프로젝트를 지우려고 한다. 그런데 아래와 같은 에러 메세지를 보여주면서 삭제할 수 없다고 한다.



[그림1] 삭제 버튼을 누르면 나오는 화면


 위와 같이 Team Explorer을 통해서는 삭제를 하지 못하고 TFSDeleteProject 명령어를 통해서 삭제를 할 수 있다. 아래 그림과 같이 "Common" 프로젝트를 삭제해 보도록 하자. 




[그림2] Common 프로젝트를 선택한 모습



이제 Visual studio를 설치한 폴더에서 아래와 같이 입력해 보자.



C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE>TFSDeleteProject.exe /force /collection:http://xxx.xxx.xxx.xxx:8080/tfs/xxx common 


Warning: Deleting a team project is an irrecoverable operation. All version control, work item tracking and Team Foundation build data will be destroyed from the system. The only way to recover this data is by restoring a stored backup of the databases. Are you sure you want to delete the team project and all of its data (Y/N)?y     <- "Y"를 입력


Deleting from Build ...

Done

Deleting from Version Control ...

Done

Deleting from Work Item Tracking ...

Done

Deleting from TestManagement ...

Done

Deleting from ProcessManagement ...

Done

Deleting from LabManagement ...

Done

Deleting from ProjectServer ...

Done

Warning. Did not find Report Server service.

Warning. Did not find SharePoint site service.

Deleting from Team Foundation Core ...

Done 

[표1] Command창에서 Common 프로젝트 삭제 (TFSDeleteProject) 명령어 입력



 위와 같이 입력하면 해당 프로젝트를 삭제할 수 있다.


Windows Azure 구조도


참고 URL
  1. http://www.microsoft.com/ko-kr/download/details.aspx?id=35473
  2. http://www.microsoft.com/en-us/download/details.aspx?id=36837



 윈도우 애저의 구조를 파악할 수 있는 자료를 올려 놓는다.




Windows Azure Poster.pdf


What is Azure v11-FINAL_ko-KR.pdf





Windows Azure Scalability.pdf



모두가 원하는 개발자 되기 10단계

  • 모두의 개발자 팁 No.1 : 블로그
  • 모두의 개발자 팁 No.2 : 오픈 소스
  • 모두의 개발자 팁 No.3 : 한 직장에 너무 오래 머물지도, 너무 자주 이직하지도 마라 
  • 모두의 개발자 팁 No.4 : 눈으로는 새로운 것을 좇되, 실용적인 것에서 손을 놓지 마라
  • 모두의 개발자 팁 No.5 : 읽는 사람을 배려해 문서를 작성하라 
  • 모두의 개발자 팁 No.6 : 간결성이 생명이다
  • 모두의 개발자 팁 No.7 : 관중을 놀라게 해라
  • 모두의 개발자 팁 No.8 : 현실적인 개발자가 되라
  • 모두의 개발자 팁 No. 9 : 툴을 이용해 어려운 문제를 해결하라
  • 모두의 개발자 팁 No.10: 겸손을 잃지 마라



자세한 정보는 위 링크를 따라가서 읽어 보기 바란다.

'기타' 카테고리의 다른 글

Messaging Service - MQ (MSMQ, SonicMQ, ZeroMQ, RabbitMQ, ActiveMQ)  (0) 2013.05.01
Big Data - 한장의 그림으로 나타내는 빅 데이타  (0) 2013.04.01
귀요미 송.  (0) 2013.03.11
Techdays  (0) 2013.03.04
밸브의 신입사원 안내서  (0) 2012.11.19

C# Task의 TaskCreationOptions별 실행 비교와
 ThreadPool의 관계
(SetMinThreads SetMaxThreads)

http://msdn.microsoft.com/ko-kr/library/system.threading.threadpool.getmaxthreads.aspx



 이번 포스트에서는 "Thread를 컨트롤"의 라디오 버튼을 이용해서 SetMinThreads와 SetMaxThreads를 통해 제한된 상황을 만들어서 컨트롤 하는 시나리오를 검토해 보도록 하겠습니다. 지난 시간에 포스트 할때 배포 되었던 소스에서 약간더 수정한 소스를 다시 올려 드리며 추가된 화면 컨트롤에 대한 설명을 더 진행하도록 하겠다.


[그림1] 새로 추가된 테스트 화면


 "그림1"에서와 같이 추가된 컨트롤에 대한 설명을 "표1"에 설명 한다.


 컨트롤 명

 설명 

 Available Thread Count

 ThreadPool에서 사용 가능한 쓰레드 수 
 Available IOC Thread Count

 ThreadPool에서 I/O 관련 사용 가능한 쓰레드 수 

[표1] 추가된 컨트롤에 대한 설명


추가된 기능은 실시간으로 ThreadPool에서 사용가능한 쓰레드 수를 화면에 보여주도록 하여 Thread 컨트롤에서 어떻게 동작하는지 보다 정확히 알 수 있도록 하였다. 

 이제 "시나리오2"처럼 실행을 해보자.


시나리오2

 1.  "Thread를 컨트롤" 라디오 버튼을 클릭

 2. 기본 세팅되어 있는 Min Worker : 4, Max Worker : 4를 확인 한다.

 3. "Set" 버튼을 클릭

 4. "Async Processing" 버튼 클릭

 5. 동시 실행 갯수 확인

 6. MaxWorker을 6으로 수정

 7. "Clear" 버튼 클릭

 8. "Set" 버튼 클릭

 9. "Async Processing"버튼 클릭

10. 동시 실행 갯수 확인



이제 시나리오 2와 같이 실행하면 "Thread"컨트롤 라디오 버튼을 클릭하면 임의의 값으로 ThreadPool을 설정할 수 있으며 설정된 정보와 같이 Task 비 동기 실행이 되는 것을 확인 할 수 있다.


[그림1] MaxWorker을 4로 세팅하고 수행하는 화면



[그림2] MaxWorker을 6로 세팅하고 수행하는 화면


 "그림1"과 "그림2"에서 확인된 것과 같이 MaxWorker로 설정된 값을 기준으로 초기 동시 실행 갯수가 제한되는 것을 확인할 수 있다. 이제 대략적인 프로그램에 대한 설명을 마친다. 이제 전체적인 개념과 프로그램 화면에 대한 사용 방법 및 개념에 대해서 어느정도 이해를 할 수 있을 정도일 것으로 예상하고 이제 소스 코드에 대해 알아 보도록 하자. 다운받을 수 있게 소스 코드를 올려 놓을 것이니 포스트에서는 핵심 코드에 대해 부가적인 설명이 필요한 부분에 대해서만 진행 하겠다. 다시 한번 더 부탁드리자면 직접 디버깅을 통해 실행 하면서 체험해 보는것이 가장 좋고 소스에 같이 주석처리된 코멘트를 잘 읽어 간다면 보다 쉽게 체득할 수 있을거라 장담한다. 이제 코드를 살펴 보도록 하자.


다운받기

TaskTest_Next.zip

<RadioButton VerticalAlignment="Center" x:Name="rdoCustomerThreadControl" Content="Thread를 컨트롤" HorizontalAlignment="Center" Margin="5, 0, 0, 0"></RadioButton>
<StackPanel Orientation="Horizontal" Margin="20, 0, 0, 0" IsEnabled="{Binding ElementName=rdoCustomerThreadControl, Path=IsChecked, Mode=TwoWay}">

[코드1] 메인 화면의 Xaml중에서 Binding을 통해 값 연결


 "코드1"에서는 IsEnabled="{Binding ...}을 통해 radCustomerThreadControl의 값이 실시간으로 변홤에 따라서 IsEnabled의 값이 변경이 되도록 Xaml단에서 연결 시켜 놓는 작업이다. 이 작업은 UI단에서의 작업이므로 전체 로직에서 차지하는 비중을 차지 하지는 않는다. 다만 Xaml을 하는 장점을 한번 보여드리고자 하였다.


// 일정 간격마다 ThreadPool을 가져와서 화면에 보여준다.
Task.Factory.StartNew(() => {
    while (true)
    {
        //Min thread work
        int minWorkerminIOC;
        ThreadPool.GetMinThreads(out minWorkerout minIOC);
        // 가져온 값으로 화면에 보여준다.
        tbMinThreadCount.Dispatcher.BeginInvoke(new Action(() => { tbMinThreadCount.Text = minWorker.ToString(); }), null);
 
        //Max thread work
        int maxWorkermaxIOC;
        ThreadPool.GetMaxThreads(out maxWorkerout maxIOC);
        // 가져온 값으로 화면에 보여준다.
        tbMaxThreadCount.Dispatcher.BeginInvoke(new Action(() => { tbMaxThreadCount.Text = maxWorker.ToString(); }), null);
 
        // 특정 시간에 스레드 풀에 있는 실제 스레드 수를 확인
        int availableWorkThreadsavailableCompletionPortThreads;
        ThreadPool.GetAvailableThreads(out availableWorkThreadsout availableCompletionPortThreads);
 
        tbAvailableThreadCount.Dispatcher.BeginInvoke(new Action(() => {
            tbAvailableThreadCount.Text = availableWorkThreads.ToString();
            tbAvailableCompletionThreadCount.Text = availableCompletionPortThreads.ToString();
        }));
 
        Thread.Sleep(1000);
    }
});

[코드2] ThreadPool의 상태를 화면에 적용 하는 코드


 "코드2"는 ThreadPool의 상태를 가져와서 텍스트 박스에 할당하는 작업을 비 동기, 주기적으로 갱신하도록 하였다. 이 작업은 실행되는 풀의 내부 상태를 바로 알 수 있도록 하기 위한것이고 동시 실행갯수에 따라서 변경되는 것을 확인할 수 있다. 


// 스레드 작성 및 소멸을 관리하기 위한 알고리즘으로 전환하기 전에 새 요청에 따라 스레드 풀이 생성하는 스레드의 최소 수를 설정합니다.
// minWorker : 스레드 풀에서 필요할 때 만드는 작업자 I/O 스레드의 최소 개수입니다. 
// minIOC : 스레드 풀에서 필요할 때 만드는 비동기 I/O 스레드의 최소 개수입니다. File.BeginWrite(,,,) 와 같이 파일 관련 비동기 함수를 실해할 때 MinIOC를 쓰레드에서 실행한다. // http://msdn.microsoft.com/ko-kr/library/system.threading.threadpool.getmaxthreads.aspx 확인 가능
ThreadPool.SetMinThreads(minWorkerminIOC);
 
 
// 동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청 수를 설정합니다. 해당 수를 넘는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.
// maxWorker : 스레드 풀에 있는 최대 작업자 스레드 수입니다. 
// minIOC : 스레드 풀에서 필요할 때 만드는 비동기 I/O 스레드의 최소 개수입니다. File.BeginWrite(,,,) 와 같이 파일 관련 비동기 함수를 실해할 때 MinIOC를 쓰레드에서 실행한다. // http://msdn.microsoft.com/ko-kr/library/system.threading.threadpool.getmaxthreads.aspx 확인 가능
ThreadPool.SetMaxThreads(maxWorkermaxIOC);

[코드3] ThreadPool에 Thread의 활동 제한을 설정 하는 코드


 "코드3"은 자동으로 변경되는 ThreadPool의 활성화 작업을 제한하는 코드로서 최저와 최고치를 설정하여 활성화 되는 쓰레드의 갯수를 제한한다. 이 작업은 "Thread를 컨트롤" 버튼을 눌러 활성화 시켰을 때에만 수행 하도록 되었다.


Task.Factory.StartNew(() =>
{
    for (int i = 1i <= counti++)
    {
        this.Dispatcher.BeginInvoke(new Action(() =>
        {
            var stackPanel = GetProgressBar();
            // 제공된 컨트롤을 리스트 객채에 넣는다.
            lstTaskResult.Items.Add(stackPanel);
        }));
    }
});

[코드4] 진행바를 ListItem 객체에 추가하는 코드


 GetProgressBar()에서 프로그래밍 적으로 프로그래스바를 화면에 보일 수 있도록 구성한 다음 진행바가 수행하는 작업을 연결 시켜 비 동기로 수행이 되도록 세팅된 StackPanel을 받아 ListItem 객체에 자식 컨트롤로 추가하는 코드다.


// Processing 버튼을 눌렀을 때 비 동기 Task가 활성화 되도록 처리 함.
Task.Factory.StartNew(() => {
 
    // Task를 활성화 시킴
    tasks.ForEach(task => task.Start());
 
    // 모두 완료가 될때까지 대기
    Task.WaitAll(tasks.ToArray());
 
    // 모든 Task가 수행을 마쳐 더 이상 관리가 필요 없어져서 관리에서 제거
    tasks.Clear();
});

[코드5] 진행바에 연결된 Task를 활성화 시키는 코드


 ForeEach의 Linq 구문을 통해 쉽게 수행이 되도록 하였으며 Task.WaitAll로 모두 완료가 될때가지 대기하도록 하였다. 완료가 되면 더 이상 사용하지 않는 Task이므로 Clear을 통해 모두 초기화 시켜주는 작업을 하였다. 


 이번 포스트는 소스코드를 포함하여 포스팅되었으며 전체 소스 설명 보다는 중요한 부분에 대해서 간략하게 설명하게 되었다. 자세한 설명은 소스를 받아 살펴 볼 수 있을 것이다.


 이 프로그램을 사용하여 Task의 비 동기 수행에 대한 특성을 좀더 쉽게 알 수 있었으면 하는 바램으로 이 글을 올리게 되었다.



Tip !

 아래와 같이 Framework에 따라 최대 허용 쓰레드 수가 다르다. ThreadPool.SetMaxThread를 통해 세팅할 수 있다.


 최대 쓰레드 수

 Platform 환경 

 1023

 32비트 .Net Framework 4

 32768  64비트 .Net Framework 4 
 250 per Core

 .Net Framework 3.5 

 25 per Core

 .Net Framework 2 




소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다.. 실제 개발에서도 필요한 소스는 단순히 Copy & Paste 만으로도 사용할 수 있습니다. 그리고 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. 
※ DOC에 대한 프로그램 정보 Util link

ing™       


Callback pattern


 자바스크립에서 함수는 객체다. 함수를 다른 함수의 인자로 넘겨 줄 수 있다. 함수에 다른 함수를 넘겨면 넘겨받은 함수에서 실행 할 것이다. 이때 넘겨 받은 함수를 콜백 함수라고 한다. 아래 코드로 확인해 보자.


[코드1] 콜백 코드 예제



 필자는 이와 같은 패턴을 공통 화면에서 리턴 받을 때 많이 사용하고는 했다. 화면마다 사용하는 공통된 기능을 만들지 않고 콜백 함수를 이용해서 리턴받아야 하는 함수를 파라메터로 넘겨줘서 해당 함수에서 콜백 함수를 호출하면 하나의 기능으로 여러 페이지에서 일관되게 사용할 수 있게 하기 때문이다. 다음 코드에서 보다 자세한 사용 방법에 대해 알아 보자.


[코드2] Callback 함수의 활용


 "코드2"에서와 같이 하나의 로직을 호출 하지만 콜백 함수를 어떻게 세팅해서 넘기는지에 따라서 해당 출력값이 확연하게 다르게 출력이 되고 있는 것을 확인 할 수 있다.


출력 값은 writePlus 콜백 함수를 넘겼을 때는 101 ~ 200까지 출력이 되고 writeMinus 콜백으로 넘겼을 때는 99 ~ 0까지 출력이 되고 있다. 이렇게 콜백을 넘겨 주는 차이로 확연하게 다른 로직이 구현되므로 중요 핵심 로직으로 결과 값을 받아와서 넘겨 받은 콜백에서 원하는 작업을 할 수 있게 하면 확장성있는 함수를 만들 수 있을 것이다.


자신을 정의 하는 함수

(Lazy function definition - Self function definition)


 함수는 동적으로 정의할 수 있고 변수에 할당할 수도 있다. 이전 변수에 새로운 함수를 할당한다면 변수는 새로운 함수를 가리키게 된다. C에서 선언 없이 포인터만 수정하는 것과 같다. 설명만으로는 장황하니 아래 코드를 보도록 하자.


[코드1] 내부에서 함수를 재 정의하는 코드 예제


 이 패턴은 함수 초기화가 필요하고 그 초기화가 한번만 필요한 곳에서 사용할 수 있다. 불 필요한 작업을 반복하지 않아도 된다. 





Javascript 함수 파라메터 생성 패턴



  Javascript platform 환경에서 개발을 하든지, Java, C#, C platform 환경에서 개발을 하든지 지향해야 하는 패턴이라고 할 수 있겠다. 바로 함수에게 넘겨주는 파라메터에 관한 패턴이다. 이 패턴을 왜 지향해야 하는지에 대해서 알아 보자.


 소프트웨어를 개발하는데 있어서 구축시 변경되는 요구사항과 유지보수에서 변경되는 사항때문에 함수는 변경이 될 수 밖에 없는 환경이다. 예를 들어 "코드1"과 같이 함수가 생성이 되었다고 가정하자.


[코드1] 함수 생성 코드 예제


 위와 같이 코드로 생성되어 개발 하다가 변경사항 때문에 파라메터를 더 추가해야 하는 상황에 빠지게 되었다. 그리고 문제는 파라메터 순서를 어떻게 정해야 하는지도 고민에 빠지게 한다. 이런 저런 고민 끝에  "코드2"와 같이 수정하게 되었다. 


[코드2] 변경된 함수 생성 코드 예제


 "코드2"에서 추가되는 파라메터 변수의 중요도 때문에 중간에 끼워 넣게 되었다. 그래서 이 함수를 사용하는 다른 곳에서도 수정이 불가피하게 되었다. 그래서 소스를 찾아 다니면서 수정을 하게 되었고 추가된 파라메터가 필요치 않는 곳에서는 "''" 공백 문자로 바꿔주는 수고까지 하게 되었다. 이런 케이스가 합리적으로 보이는가? 이제 한번 개선시켜 보자. "코드3"을 살펴 보도록 하자.


[코드3] 객체로 파라메터 함수 생성 코드 예제


 "코드3"과 같이 선언하면 다음과 같은 장점이 있다.

  • 매개변수와 순서를 기억할 필요가 없다.
  • 선택적인 매개변수를 안전하게 생략할 수 있다. ( 이름 지원하기 위해서는 해당 함수에서 검증하는 단계에서 에러 처리를 해줘야 가능 하다. )
  • 읽기 쉽고 유지보수가 편하다.
  • 매개 변수를 추가하거나 제거하기가 편한다.
단점은 아래와 같다.
  • 매개변수의 이름을 기억해야 한다.
  • 프로퍼티 이름은 압축되지 않는다. ( 압축 프로그램에서 매개 변수의 이름은 단순한 문자로 치환하여 전체 소스 크기를 줄이는 작업이 안된다. 그렇지만 일부 유틸에서는 프로퍼티의 매개변수도 압축을 해준다. - 구글 Utility - 그렇지만 배포를 해야 하는 상황에서는 적합한 모델이 아니다. 일부 Intellisense가 지원되는 도구에서는 연상되지 않는 프로퍼티명으로 나오게 하기 때문이다. )


 함수를 생성함에 있어서 최소한의 파라메터를 받고 넘겨 줄 수 있는 방안을 고려하여 생성 하도록 하자. 더군다나 라이브러리를 배포할 때는 더욱더 신경 써야 할 것이다. 한번 배포가 되고 나면 수정하는데 비용이 상상이상으로 많이 들기 때문이다. 

C# Task의 TaskCreationOptions별 실행 비교와
 ThreadPool의 관계
(SetMinThreads SetMaxThreads)



 이번에는 Task가 내부적으로 어떤 방식으로 동작하고 수행되는지에 대해서 알아가는 시간을 가져 보고자 한다. 지금까지 흔히 Task.Factory.Start()를 통해서 타스크를 생성하고 비 동기로 수행이 되도록 작업을 수행하여 왔지만 깊이 있게 다뤄보지는 안았었다. 그래서 비주얼 적으로 확인하기 위해 WPF 프로젝트를 만들어 확인 할 것이다. 아래 "그림1"은 WPF를 통해 Task 수행결과를 확인할 수 있는 화면을 먼저 보도록 하자.


[그림1] WPF를 통해서 Task 수행 결과를 확인하는 화면


[이번에는 프로젝트를 압축해서 다운 받을 수 있게 올려 두었으니 바로 다운받아 확인할 수 있을 것이다.

TaskTest.zip (클릭하면 다운로드 됨)]


 우선 소스에 대한 설명 보다는 프로그램 화면을 확인하면서 설명하면 소스의 전체적인 흐름을 알 수 있을 것이고 그것을 알면 코드를 보다 쉽게 이해할 수 있으리라는 생각이다. 그럼 지금부터 잘 따라워 주면 좋겠다. 아래 "표1"은 버튼에 대한 설명 및 선택 인자에 대한 간단한 화면 설명부터 시작하도록 하겠다.


 Set

 ProgressBar를 ListItem에 추가하고 Task를 생성하여 추가된 Progress에 연결하여 비 동기로 진행바를 변경 할수 있도록 세팅한다.

 Clear

 추가된 컨트롤을 ListItem에서 모두 지운다.

 다른 변수에 대해서도 초기화를 수행 한다.

 Async Processing

 Set에서 추가된 컨트롤에 연결된 Task를 활성화 시켜 비 동기 수행 작업으로 진행바를 증가 시키도록 한다. 

 Async Cancel

 수행되고 있는 Task를 취소 한다  

 Min Thread Count   취소 동시 실행 갯수 
 Max Thread Count 

 최대 동시 실행 갯수 

 Thread를 컨트롤

 Radio 버튼으로 되어 있어서 한번 선택이 되면 취소할 수 없도록 하였다.
 선택되면 TextBox를 사용할 수 있도록 활성화 된다. 

 MinWorker  Min Thread Count를 해당 숫자로 세팅한다. 
 MinIOC  Min Thread IOC Count를 해당 숫자로 세팅한다.   
 MaxWorker

 Max Thread Count를 해당 숫자로 세팅한다. 

 MaxIOC

 Max Thread IOC Count를 해당 숫자로 세팅한다. 

 Slide Control

 Set 버튼을 눌렀을 때 한번에 추가될 컨트롤 갯수 선택 할 수 있음.

 ComboBox

 선택된 값으로 Task생성 시 TaskCreationOptions으로 세팅한다.


 None
 기본 동작이 사용되도록 지정합니다.
 PreferFairness
 가능한 한 공정한 방식, 즉 일찍 예약된 작업은 일찍 실행되고 나중에 예약된 작업은 나중에 실행될 수 있는 방식으로 작업을 예약하는 TaskScheduler에 대한 힌트입니다.
 LongRunning
 작업이 장기 실행되는 정교하지 않은 작업이 되도록 지정합니다.초과 구독을 보장할 수 있는 TaskScheduler에 대한 힌트를 제공합니다.
 AttachedToParent
 작업이 작업 계층 구조의 부모에 연결되도록 지정합니다.
 DenyChildAttach
 지정 하는 InvalidOperationException 만들어진된 작업에는 자식 작업을 첨부 하려고 시도 하는 경우에 throw 됩니다.
 HideScheduler
 앰비언트 스케줄러를 현재 스케줄러에서 만들어진된 작업으로 표시 되지 않습니다.즉, StartNew 또는 Continuewith와 같은 생성된 작업을 수행 하는 작업을 볼 수 있도록 Default 현재 스케줄러로 합니다.


[표1] 화면 행위 단위 설명표


 이제 표를 확인했으니 버튼을 누르면 어떻게 동작하는지 대충 알거라 생각한다. 그렇다면 이제 다운 받은 압축 파일을 풀어서 실행해 보자. 아무 버튼이나 눌러봐도 컴퓨터에 이상이 있지는 안을것이기에 걱정하지 말고 마구마구 눌러 보자. 만약 "Async Processing"을 눌렀다면 진행바가 움직이면서 작업이 수행되는 것을 확인할 수 있을 것이다. 몇번의 클릭 만으로도 전체적인 흐름을 간략하게나마 체험적으로 알 수 있을 것이다. 그렇다면 필자의 의도대로 아래와 같은 시나리오로 한번 따라서 실행해 보기를 바란다. 만약 제대로 따라 했다면 뭔가 이상한 점을 발견할 수 있을 것이다. 


시나리오 :
 1. "None" 상태의 콤보박스에서 "Set"버튼을 누르면 10개의 진행바가 추가되며(10개 추가됨) 
 2. "Async Processing"을 누르면 진행바가 움직인다. 작업이 완료 후
 3. "Clear" 버튼을 누르면 초기화가 되고 다시 한번 더
 4. "Set"을 누르고
 5. "Async Processing" 버튼을 누른다.
 

[시나리오1] Min, Max Thread 활성화 변경 확인 시나리오


 위와 같은 시나리오와 같은 방법으로 확인해 보면 처음에는 몇개의 진행바만(테스트 환경의 CPU Core마다 다를 수 있다, 4 Core면 네개의 진행바가 변경되는 것을 확인할 수 있을 것이다. 그렇지만 실제로는 3개의 진행바만 움직이는데 그 이유는 하나의 Task가 내부적으로 계속 활성화 되어 있어서 발생하는 현상이다. (활성화된 Task는 Min Thread Count와 Max Thread Count의 값을 지속적으로 화면에 갱신하여 변화되는 값을 보여주는 작업 진행하고 있다) 3개의 진행바가 변경이 되고 있는 상태에서 완료되지 않은 다른 진행바가 순차적으로 작업이 시작되어 값이 변경 된다. 이건 내부적으로 Thread.Sleep 때문에 일어나는 현상이기도 하다. 그러면서 최종적으로는 10개의 진행바가 모두 변경(내부적으로 Task가 실행이 되고 있다.)이 되는 것을 확인할 수 있다. 이와 같이 10개의 Task가 활성화 되어 있는 상태는 ThreadPool이 내부에 관리되고 있는 동시 실행 가능한 갯수를 10개로 세팅된 상태로 변경이 된다.  이런 상태에서 "시나리오1"의 3, 4, 5를 차례로 수행하면 첫번째 실행된 행동 패턴과는 다르게 10개의 진행바가 한번에 진행되는 것을 확인 할 수 있다.


 결과적으로 비 동기 Task 수행도 내부적으로는 ThreadPool에서 관리를 받으며 수행이 된다는 것을 확인 할 수 있다. 조금더 자세한 사항은 Task.Factory를 커스터마이징 하는 포스트에서도 확인할 수 있을 것이다. 


[그림2] PreferFaimess Async Processing 한번 실행 후 Clear -> Set -> Async Processing 실행 결과 화면


 "그림2"에서와 같이 동시 실행 갯수가 10개로 같이 시작 하는것을 확인 할 수 있다. 그렇지만 이런 유형은 Thread.Sleep(1)의 구문으로 인해 발생하는 현상이다. Sleep 없이 비 동기를 실행 하면 절대적인 CPU Core수의 제한을 받게 된다. 그에 대한 확인으로 Sleep대신에 Task.SpinWait(500000)으로 수정하고 비 동기로 실행하면 위와 같은 현상과는 다르게 나타난다.


 지금까지 전체적인 흐름과 하나의 시나리오에 대해서 설명을 하게 되었고 그 이외의 다른 시나리오와 소스에 대한 설명은 다음 포스트에 이어서 하도록 하겠다.


( 무엇보다 이번 포스트는 올려 놓은 소스를 다운 받아서 직접 테스트와 디버깅을 통해 몸소 체험과 분석을 통해 체득하는 과정이 필수라고 알려주고 싶다. 눈으로만 보는것과 직접 체험해 보는건 하늘과 땅 차이만큼 많은 깨우침의 차이를 가져올거라 믿고 있다. )


소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다.. 실제 개발에서도 필요한 소스는 단순히 Copy & Paste 만으로도 사용할 수 있습니다. 그리고 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. 
※ DOC에 대한 프로그램 정보 Util link

ing™       


+ Recent posts