[dot Net] 사용자를 배려하는 개발 <2> 중복 실행 방지와 중복 클릭 방지

기본에 충실한 .net 프로그램을

어떻게 만들어 나갈 것인지에 대한 과정을 이야기하는

사용자를 배려하는 개발 <2>번째 편입니다.




중복 실행 방지


프로그램 구성에 따라

HW의 성능에 따라

프로그램 실행 속도는 큰 차이가 납니다.


프로그램을 실행하는 방법은 다양하지만

가장 일반적으로 사용자가 실행하는 방법은

실행 파일 아이콘이나 바로 가기 파일

더블 클릭하는 경우일 겁니다.


프로그램을 실행하고 나서

반응이 없을 경우

작업관리자나 cmd창을 열어서 프로세스가 실행 중인지 확인합니다.(!)

프로세스가 실행 중이지 않다면 다시 더블 클릭으로 파일을 실행합니다.

과연 이런 사용자가 존재할까요?


프로그램을 중복 실행 방지해 놓지 않으면

실행이 왜 안될까? 하고

사용자가 더블클릭 남발하게 되면

일정 시간 만에 무수히 많은 프로그램이 실행될 수 있습니다.

그리고 정상 작동하지 않아 장애가 될 수 있습니다.


private bool CheckRunThisProcess()
{
    bool rslt = false;
    int processcount = 0;
    System.Diagnostics.Process[] procs;
    procs = System.Diagnostics.Process.GetProcesses();
    foreach (System.Diagnostics.Process aProc in procs)
    {
        if (aProc.ProcessName.ToString().Equals("ProcessName"))
        {
            processcount++;
            if(processcount>1)
            {
                rslt = true;
                break;
            }
        }
    }
    return rslt;
}

중복 실행 방지에 많은 좋은 방법과 훌륭한 방법이 있겠지만

현재 실행 중인 프로세스들과 실행하는 이 프로세스 이름을 비교하여

같은 이름일 경우를 체크하는 간단한 함수를 만들어 사용했습니다.


중복 실행이 필요한 프로그램을 제외하고

가장 먼저 추가되는 기본 소스 중 하나가 되었습니다.


함수 사용 방법은 메인폼이 로드 될 때 검증하고

true일 경우에 프로그램을 Close 합니다.




중복 클릭 방지


프로그램을 중복 실행한 경험은 없으시더라도

프로그램 안에 기능을 중복 실행하여 장애가 발생했던 적은 없으신가요?


기능에 따라 중복 클릭이 필요한 경우도 있겠지만

중복 클릭이 발생할 경우 장애를 야기시키는 경우도 존재합니다.

long OldButtonClickTime = 0;
private bool CheckDoubleClick()
{
    bool rslt = false;
    long CurrentButtonClickTime = DateTime.Now.Ticks;
    if(CurrentButtonClickTime - OldButtonClickTime < 4000000)
    {
        rslt = true;
    }
    OldButtonClickTime = CurrentButtonClickTime;

    return rslt;
}

중복 클릭 방지에 많은 좋은 방법과 훌륭한 방법이 있겠지만

현재 클릭 시간과 이전 클릭 시간을 비교해서

0.4초 만에 버튼을 클릭할 경우 더블클릭으로 판단하는

아주 간단한 함수를 만들었습니다.


해당 함수는 버튼이 클릭될 때 발생하는 Click 함수에

아래와 같이 사용하시면 됩니다.

물론 버튼 외 다른 기능에도 적용 가능합니다.

그 기능이 0.4초 기준으로 걸러야 할 필요가 있다면요.

private void Button1_Click(object sender, EventArgs e)
{
	if(CheckDoubleClick())
    {
        return;
    }
}

생각보다 중복 클릭을 방지할 필요가 없으실 수 있지만

중복 클릭했을 때 장애가 발생할 수 있는 경우라면

심각한 문제로 발전할 수 있습니다.




프로그램의 장애 발생 방지 차원에서라도

중복 방지는 꼭 필요한 기능으로 생각했습니다.


프로젝트를 생성할 때 처음 추가하고 있습니다.

더 좋은 방법을 찾으면 보다 발전 시켜서 사용할 예정입니다.


감사합니다.