진짜 오랫동안 삽질했던, 프로그램 비정상 종료 대처법

2023. 10. 11. 16:31· Server/C#

프로그램을 비정상 종료하면 에러가 뜰때가 많습니다.

이러한 경우의 에러를 없애는 방법 몇가지에 대해 소개드리겠습니다.

 

 

제가 발견한 방법은, 비정상 종료 시 호출되는 이벤트에 콜백 메서드를 추가하는 것이었습니다!

제가 찾은 이벤트는 두 종류입니다!

 

 

 

Console.CancleKeyPress 사용

- Stop 버튼을 눌러 프로그램을 종료한 경우

- Ctrl + c 를 눌러 프로그램을 종료한 경우

우측 상단의 빨간 네모가 Stop 버튼

 

using System.Diagnostics;
using System.Runtime.CompilerServices;
using TCPClient;

class Program
{
    private static List<Client> clients = new List<Client>();
    
    public static void Main(string[] args)
    {
        Console.CancelKeyPress += OnCancelKeyPress; // like this
        
        for (int i = 0; i < 100; i++)
        {
            Task.Run(()=>WorkAsync());
        }

        string input = "";
        while (input != "exit")
        {
            input = Console.ReadLine();
            int threadCount = ThreadPool.ThreadCount;
        }
        
        Console.CancelKeyPress -= OnCancelKeyPress;

        foreach (var client in clients)
        {
            client.Disconnect();
        }
    }

    public static async Task WorkAsync()
    {
        var client = new Client();
        lock (clients)
        {
            clients.Add(client);
        }
    }
    
    private static void OnCancelKeyPress(object sender, EventArgs e)
    {
        foreach (var client in clients)
        {
            client.Disconnect();
        }
    }
}

 

위와 같이 CancelKeyPress 를 사용하면 비정상 종료 시 이벤트로 원하는 함수를 실행할 수 있습니다.

 

 

 

 

 

Process.Exited

해당 방법은 정상 종료 시에 실행하는 이벤트를 이용한 메서드입니다.

using System.Diagnostics;
using System.Runtime.CompilerServices;
using TCPClient;

class Program
{
    private static List<Client> clients = new List<Client>();
    
    public static void Main(string[] args)
    {
        Process.GetCurrentProcess().Exited += OnCancelKeyPress; // like this
        
        for (int i = 0; i < 100; i++)
        {
            Task.Run(()=>WorkAsync());
        }

        string input = "";
        while (input != "exit")
        {
            input = Console.ReadLine();
            int threadCount = ThreadPool.ThreadCount;
        }

        foreach (var client in clients)
        {
            client.Disconnect();
        }
    }

    public static async Task WorkAsync()
    {
        var client = new Client();
        lock (clients)
        {
            clients.Add(client);
        }
    }
    
    private static void OnCancelKeyPress(object sender, EventArgs e)
    {
        foreach (var client in clients)
        {
            client.Disconnect();
        }
    }
}

 

위 방법을 적절히 사용하면 프로그램을 보다 안전하게 종료할 수 있습니다.

'Server > C#' 카테고리의 다른 글

맨날 헷갈리는 상속 오버라이딩 정리  (0) 2024.01.02
딕셔너리 vs 해시테이블  (2) 2023.11.28
C#의 장점  (2) 2023.08.03
정확하게 코딩했는지 확인하자! 나의 프로그램 테스트 방법  (0) 2023.07.18
[C#] out of range 에러에 대처하는 천재적인 방법  (0) 2023.07.04
'Server/C#' 카테고리의 다른 글
  • 맨날 헷갈리는 상속 오버라이딩 정리
  • 딕셔너리 vs 해시테이블
  • C#의 장점
  • 정확하게 코딩했는지 확인하자! 나의 프로그램 테스트 방법
개발자 재은
개발자 재은
개발자 재은
개발자 재은
개발자 재은
전체
오늘
어제
  • 분류 전체보기 (72)
    • Client (5)
      • MSW (5)
    • Server (25)
      • AWS (2)
      • C# (15)
      • C# 비동기와의 전쟁 (5)
      • Linux (3)
      • MySQL (0)
      • Orleans(정리안됨) (0)
    • Error Note (2)
    • Side Project (15)
      • 안양시장 프로젝트 - TCP 서버개발 (15)
    • 일지 (25)
      • 일기장 (16)
      • 2022 MSW 해커톤 대상 후기 (5)
      • 자기소개 (0)
      • 미완성 포스트 (1)
      • 넥토리얼 합격 회고 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
개발자 재은
진짜 오랫동안 삽질했던, 프로그램 비정상 종료 대처법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.