아래와 같은 메소드와 변수들이 있을경우 메모리에서는 도대체 무슨일이 일어나는가??
출처 http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types
다음에는 new로 인스턴스를 두개 생성했을경우의 그림이다.
이렇게 스택과 힙 두영역에 나누어 지고
힙영역의 메모리가 가득찬다면 C#? 닷넷에서는
Garbage Collecter가 자동적으로 메모리를 관리해준다.
사용하지 않거나 사용한지 오래된 것은 GC가 알아서 처리하여 메모리를관리해준다고 한다.
하지만 직접적인 GC 호출은 시스템에 성능저하를 유발할수 있어 불가피한상황이 아니라면 피해야한다고 함.
GC 사용을 하지말라면???
IDispose, Finalize 를 구현하자!!! 단, C#에서는 소멸자를 사용하지말자?
예를 들자면 대용량의 객체를 사용한뒤 시스템 부하를 줄여야 하는상황..
다음의 코드는 인자로 받아진 object의 메모리 주소를 알아보는 코드다
{
2012년 12월 19일 수요일
Thread 개념
Socket통신을 사용하다가 Client가 통신이 끊기게 되면
Server는 이를 알아채고 클라이언트의 접속을 다시 대기해야합니다.
Socket.Accept();
Accept()부분을 쓰레드로 생성하여
기본 스레드와 별개로 스레드를 생성해서 Accept()를 했습니다.
이러면 기본스레드에 대해 비동기적으로 Accept()를 수행됩니다.
스레드를 이해하고 얼마 지나지 않으면 스레드에 기억이..가물가물..
또 다시 스레드에대 학습하게 됩니다.-_-;;
간단히 스레드에 대해 알아봅시다.
Worker클래스의 DoWork 메소드를
Thread.Start() 메소드로 실행하여 줍니다.
workThread.IsAlive 는 현재 스레드의 실행상태를 나타내는 값을 가져옵니다.
스레드가 시작되었으며 정상적으로 종료 또는 중단되지 않았으면 true고, 그렇지않으면 false
Thread.Sleep(1); 이렇게 한다면 기본스레드가 잠시 중단하고
다른 스레드(workerThread)는 DoWork메소드의 루프를 몇차례 반복하여 실행할수 있습니다.
Thraed.Abort()는 다른 스레드에서 스레드를 종료 할수 있습니다.
하지만 스레드의 작업이 완료됬는지 관계없이 스레드가 종료되어 리소스를 정리할수없습니다.
그래서 기본스레드(메인)에서 Thread.Join()메소드를 호출하여
개체가 가리키는 스레드가 종료될때까지 현재 스레드를 차단하거나 대기상태로 만듭니다.
Join()은 작업자스레드가 반환되고 자체 종료될떄까지 반환되지 않습니다.
관련내용은 http://msdn.microsoft.com/ko-kr/library/7a2f3ay4(v=vs.90).aspx
다음글에서 쓰레드와 관련되는 클래스를 만들어 사용해 보기로 합시다.
Server는 이를 알아채고 클라이언트의 접속을 다시 대기해야합니다.
Socket.Accept();
Accept()부분을 쓰레드로 생성하여
기본 스레드와 별개로 스레드를 생성해서 Accept()를 했습니다.
이러면 기본스레드에 대해 비동기적으로 Accept()를 수행됩니다.
스레드를 이해하고 얼마 지나지 않으면 스레드에 기억이..가물가물..
또 다시 스레드에대 학습하게 됩니다.-_-;;
간단히 스레드에 대해 알아봅시다.
Worker클래스의 DoWork 메소드를
Thread.Start() 메소드로 실행하여 줍니다.
workThread.IsAlive 는 현재 스레드의 실행상태를 나타내는 값을 가져옵니다.
스레드가 시작되었으며 정상적으로 종료 또는 중단되지 않았으면 true고, 그렇지않으면 false
Thread.Sleep(1); 이렇게 한다면 기본스레드가 잠시 중단하고
다른 스레드(workerThread)는 DoWork메소드의 루프를 몇차례 반복하여 실행할수 있습니다.
Thraed.Abort()는 다른 스레드에서 스레드를 종료 할수 있습니다.
하지만 스레드의 작업이 완료됬는지 관계없이 스레드가 종료되어 리소스를 정리할수없습니다.
그래서 기본스레드(메인)에서 Thread.Join()메소드를 호출하여
개체가 가리키는 스레드가 종료될때까지 현재 스레드를 차단하거나 대기상태로 만듭니다.
Join()은 작업자스레드가 반환되고 자체 종료될떄까지 반환되지 않습니다.
관련내용은 http://msdn.microsoft.com/ko-kr/library/7a2f3ay4(v=vs.90).aspx
다음글에서 쓰레드와 관련되는 클래스를 만들어 사용해 보기로 합시다.
사용자정의 컨트롤 만들어보기 (ProgressBar)
C# 닷넷 컴포넌트의 ProgressBar가 있습니다.
닷넷 프로그래스바의 내부에 Text라던가 Label을 넣어
프로그래스바와 내부에 글자를 넣어 보겠습니다.
우리가 만들것은 아래의 그림과 같은 ProgressBar 사용자 정의 컨트롤 입니다. 추가 => 사용자 정의컨트롤을 선택하여 CProgressBar.cs 를 생성합니다.
이제 코딩을 시작해 봅시다.
우선, 디자인부분에서 프로그래스바와 내부에 위치할 Text를 가질 Label을 넣어줍니다.
하나의 TableLayoutPanel(열 두개)을 만들고
각 열에 Label을 만들어넣습니다(구분을 명확하게 하기위해 Color를 임의로 넣어준겁니다.)
TableLayoutPanel과 Label의 BackColor는 투명하게 해줍니다(TransParent)
코드를 살펴봅시다.
CProgressBa 생성자에 디자이너부분에서 만든 Label들의 ForeColor와 Font를 지정합니다.
(불필요한 작업같군요. 안해줘도 될거 같아요)
맴버 변수 선언부분입니다.
Pen pen은 열을 구분하기 위해 OnPaint시 사용할 Color입니다.
┌───────────┐
│ │ │
└───────────┘빨간 구분선
protected 선언된 맴버변수는 디자이너의 속성창을 보면 생성되어져 보입니다.
속성창에서 값을 변경하게 되면 아래의 맴버변수들의 변경되는거지요.
protected로 선언되었으니 이를 대신 받아줄 get; set 변수들이 필요합니다.
아래에서 Value 즉 Percent값의 변경될때마다 Invalidate()를 호출하는데요
this.Invalidate()메소드를 호출할때마다 OnPaint()메소드를 재 호출 합니다
OnPaint 메소드를 오버라이드 해서 필요한 것을 그려주면 되는것이지요
ClientRectangle은 컨트롤 영역의 사각형을 가지고 계산식으로
Rectangle에 색깔을 입히게 되는겁니다.
닷넷 프로그래스바의 내부에 Text라던가 Label을 넣어
프로그래스바와 내부에 글자를 넣어 보겠습니다.
우리가 만들것은 아래의 그림과 같은 ProgressBar 사용자 정의 컨트롤 입니다. 추가 => 사용자 정의컨트롤을 선택하여 CProgressBar.cs 를 생성합니다.
이제 코딩을 시작해 봅시다.
우선, 디자인부분에서 프로그래스바와 내부에 위치할 Text를 가질 Label을 넣어줍니다.
하나의 TableLayoutPanel(열 두개)을 만들고
각 열에 Label을 만들어넣습니다(구분을 명확하게 하기위해 Color를 임의로 넣어준겁니다.)
TableLayoutPanel과 Label의 BackColor는 투명하게 해줍니다(TransParent)
코드를 살펴봅시다.
CProgressBa 생성자에 디자이너부분에서 만든 Label들의 ForeColor와 Font를 지정합니다.
(불필요한 작업같군요. 안해줘도 될거 같아요)
맴버 변수 선언부분입니다.
Pen pen은 열을 구분하기 위해 OnPaint시 사용할 Color입니다.
┌───────────┐
│ │ │
└───────────┘빨간 구분선
protected 선언된 맴버변수는 디자이너의 속성창을 보면 생성되어져 보입니다.
속성창에서 값을 변경하게 되면 아래의 맴버변수들의 변경되는거지요.
protected로 선언되었으니 이를 대신 받아줄 get; set 변수들이 필요합니다.
아래에서 Value 즉 Percent값의 변경될때마다 Invalidate()를 호출하는데요
this.Invalidate()메소드를 호출할때마다 OnPaint()메소드를 재 호출 합니다
OnPaint 메소드를 오버라이드 해서 필요한 것을 그려주면 되는것이지요
ClientRectangle은 컨트롤 영역의 사각형을 가지고 계산식으로
Rectangle에 색깔을 입히게 되는겁니다.
Socket(Tcp) 비동기 Server
c# Socket의 비동기 서버 입니다.
비동기 부분에서 눈여겨 봐야할부분은
BeginAccept <====> EndAccept
BeginSend <====> EndSend
BeginReceive <====> EndReceive
메소드들의 짝을 이뤄야한다는점입니다.
Socket.BeginSend()의 원형을 보면(MSDN Library 참고 및 검색) AsyncCallback 대리자
Object state 상태정보를 포함한 객체(사용자정의객체도 됨)를 눈여겨봐야할것같습니다.
예외처리시 SocketException이 발생하는데요
SocketException.SocektErrorCode의 맴버들을 적절히 사용해야됩니다.
NotConnected = Socket의 연결되지 않은 상태로 응용프로그램에서 데이터를 보내고 받으...
ConnectionRefused = 원격호스트가 연결을 거부했습니다.
ConnectionReset = 원격피어가 연결을 다시 설정했습니다. 등등등.
비동기 부분에서 눈여겨 봐야할부분은
BeginAccept <====> EndAccept
BeginSend <====> EndSend
BeginReceive <====> EndReceive
메소드들의 짝을 이뤄야한다는점입니다.
Socket.BeginSend()의 원형을 보면(MSDN Library 참고 및 검색) AsyncCallback 대리자
Object state 상태정보를 포함한 객체(사용자정의객체도 됨)를 눈여겨봐야할것같습니다.
예외처리시 SocketException이 발생하는데요
SocketException.SocektErrorCode의 맴버들을 적절히 사용해야됩니다.
NotConnected = Socket의 연결되지 않은 상태로 응용프로그램에서 데이터를 보내고 받으...
ConnectionRefused = 원격호스트가 연결을 거부했습니다.
ConnectionReset = 원격피어가 연결을 다시 설정했습니다. 등등등.
2012년 12월 17일 월요일
피드 구독하기:
글 (Atom)