c#

  • [c#] 윈도우즈 폼즈 애플리캐이션 강제로 종료하기

    흔히 애플리캐이션을 종료할 때 아래의 방법들을 쓴다. 위 방법들의 문제는 form closing 이벤트가 실행된다는 거다. 이 이벤트에 무언가 내용이 있다면 실행이 될 텐데 그렇다면 강제 종료가 아니다. 묻지도 따지지도 않고 강제로 끝내 버리려면 아래와 같이 한다. 첫째 방법은 말 그대로 매인 뜨레드만 종료한다. 따라서 여전히 작동하고 있는 다른 뜨레드가 있다면 마치 애플리캐이션이 종료된 거처럼 보여도…

  • [c#] 프로세스의 cpu 점유율 측정하기 – PerformanceCounter

    To read from a performance counter, create an instance of the PerformanceCounter class, set the CategoryName, CounterName, and, optionally, the InstanceName or MachineName properties, and then call the NextValue method to take a performance counter reading.– PerformanceCounter Class CategoryName과 CounterName을 아규먼트로 넣어야 하는데 InstanceName 등은 넣어야 할 때가 있고 그러지 않아도 될 때가 있다는 말이다….

  • [c#] 간단한 멀티 뜨레드, 크로스 뜨레드, 인보크 예제

    위 예제는 뜨레드를 새로 만들어서 래이블에 문자를 출력하는 거다. TaskFactory.StartNew를 이용하여 새로운 뜨레드를 만들고 실행한다. Control.Invoke를 이용하여 새로 생긴 뜨레드에서 크로스 뜨레드 오류를 피하여 매인 뜨레드에서 만들어진 래이블에 문자를 출력한다.

  • [프로그래밍] 쉬운 인터패이스 설명 – interface와 class 비교

    interface는 클래스와 비슷하여 c#의 경우 type system 항목에 같이 설명되어 있다. 아래의 예제는 인터패이스 안에 하나의 메떠드를 선언한 뒤 두 개의 서로 다른 내용으로 실행되게 하는 거다. 클래스 안에서는 메떠드를 선언하고 실행부까지 코딩할 수 있지만 인터패이스에선 그렇게 할 수 없다. 대신 클래스가 인터패이스를 상속하여 자유롭게 실행부를 코딩할 수 있다. 심지어 여러 인터패이스들을 동시에 상속할 수도…

  • [c#] 동적으로 비주얼 컨트롤 만들기

    여기에서 Controls는 this.Controls에서 Form1을 뜻하는 this를 생략한 거다. 마이크로소프트는 this에 대해 설명하기를 멤버들의 이름이 같아서 소속을 알기 애매한 경우에 특정 멤버를 한정하려면 이 키워드를 쓰라고 한다. 따라서 이걸 반대로 해석하면 다른 멤버와 이름이 헷갈릴 여지가 없어서 굳이 한정을 할 필요가 없을 땐 쓰지 않아도 된다. 바로 위와 같은 경우다.

  • [c#] 폼이 종료되었는지 확인하는 방법

    폼이 종료되었는지 확인해야 할 때가 있다. 예를 들어 설정 창을 새로운 폼으로 만든 때 이 창은 하나만 떠야 한다. 설정 창을 두 개 이상 동시에 열리지 않게 하려면 이 창이 열려 있지 않을 때에만 창이 만들어지게 하면 된다. 근데 이게 약간 복잡하다. 아래와 같이 form이 visible한지 확인하려고 하면 오류로 멈춘다. 폼을 선언만 하고 인스턴스를 만들지는…

  • [c#] 크로스-스레드인데 예외로 처리되지 않는 경우

    예전에는 멀티스레드를 구현할 할 때 Thread나 ThreadPool을 이용했지만 요샌 Task를 주로 쓴다. 이건 ThreadPool을 기본으로 하여 기능들이 추가된 거다. 마이크로소프트는 비동기 작업을 할 때 Task 이용을 권장하지만 이게 좋기만 한 거는 아니다. ThreadPool을 이용하면 예외로 처리되는데 Task로 하면 예외로 처리되지 않는 경우들이 있다. 이러면 크로스-스레드로 인해 엉뚱하게 작동을 해도 프로그래머는 모를 수 있다. 오류error와 예외exception는 프로그래밍을…

  • [c#] 크로스-스레드 예외 해결하기

    lock 제일 간단한 방법이다. 그러나 디버그 빌드로 실행하면 오류로 처리되고 릴리스 빌드를 한 때에만 제대로 작동한다. 이는 Control.CheckForIllegalCrossThreadCalls 프라퍼티 때문인데 이게 디버그 빌드를 할 때에는 true가 기본 값이고 릴리스 빌드를 할 때에는 false가 기본 값이다. 실행이 되는지 여부가 중요한 게 아니라 제대로 된 결과가 나오느냐 하는 게 문제다. 비록 아래 예제는 간단하여 의도한 대로 실행이 되지만 lock을…