윈도우 프로그래밍을 하다보면 생각보다 버그가 많다는것을 알게 된다.
특히 C# 초보개발자들이 핸들 누수에 대한 내용을 모르고
윈도우 프로그래밍을 하다보면 , 핸들 누수가 생긴다.
그리고 문제를 찾기가 힘들어진다.
짧은 지식으로 간단히 개념을 예기해보겠다. (아닐수도 있으니 참고만 하자)
윈폼에서 윈도우를 띄우고 버튼을 만들고 실행하면 버튼에 핸들이 하나 정해진다. (윈도우가 정함)
누군가 버튼을 찾으려면 핸들번호를 찾아서 처리하는 식으로 ,, 개체에 접근할때 사용하게 되며
여기서 중요한것은, 특정 프로그램 때문에 핸들누수가 100만 정도를 넘어섰을때
운영체제가 핸들을 할당해야하는데 핸들테이블에 핸들이 너무 많아서
어쩔줄을 몰라하며 새로운 프로그램을 실행시켜도 핸들할당이 엄청 느려지고
결국 윈도우 바탕화면에서 어떤 클릭도 안되는 먹통까지 이어진다. (손으로 PC 꺼야됨)
모든 접근에 대한것들에 핸들이 붙는다고 생각하면 되는데
중요한것은 자동으로 가비지 컬렉터가 안되는 경우가 많다.
이때 강제로 가비지 컬렉트 코드를 넣어도 안되는건 마찬가지다.
using ( ) 문을 쓰더라도 안되는게 있는것 같다.
핸들 누수가 될수 잇는 부분들은 별도 함수로 모아두고, 누수가 있을때 해당 함수를 생략해서 범위를 좁혀간다.
핸들 누수를 잘 찾아가는 방법이 있으면 누가좀 알기 쉽게 알려줬으면 좋겠다.
개발요령
1. 변수를 선언하고 나서 반드시 끝에 dispose() 처리를 해준다.
2. dispose()가 없는것들은 값에 null 을 넣어주자.
3. 반복문 내에서 new 선언이 계속되는 형태의 변수라면 메모리를 상시 점유하더라도 전역변수로 만들어두고 쓰자.
4. string에 + 연산을 쓰면 +를 쓸때마다 변수가 할당된다고 들은것같은데,
string을 많이 붙여야하는경우 stringbuilder 클래스를 쓰라고 하더라.
5. 주기적으로 반복실행되는 코드일때, 누수가 되는 코드가 있다면
그냥 별도 1회 실행되는 프로세스(프로그램)으로 만들어서 실행후 종료되게 하자.
프로세스가 종료되면 모든 핸들은 자동으로 운영체제 반납되서 가장 확실하게 처리된다. ㅠ
'다양한 실전소스코드 > WPF(C#)' 카테고리의 다른 글
WPF String format : xaml / code behind (0) | 2023.01.03 |
---|---|
[Solved] WPF TextBox 한글/영어 키보드 자동으로 (0) | 2021.07.12 |
[Solved] C# Python Run.. C# WPF에서 파이썬 실행방법 (0) | 2021.06.29 |
C# WPF ScrollViewer move to Origin (0) | 2021.06.29 |
[Solved] C# WPF Web Script Error (스크립트 에러 제거) (0) | 2021.06.29 |
댓글