[C#] 타임아웃 구현

Jaemoon Lee·2022년 9월 28일
0

[C샾]

목록 보기
2/13

20220928

프로그램의 소켓통신 메시지 RCV 조건에 타임아웃을 추가해야된다.

메시지 리시브의 타임아웃을 설정하는 방법을 몇가지 생각해봤다.

  1. Max TimeOut 변수를 선언, (ex) 3초간 기다리고 싶다.)
  2. 시간을 측정하는 변수 선언,
 maxD = TimeSpan.FromSeconds(3);
 sw1 = Stopwatch.StartNew();

※ TimeSpan : 시간 간격을 나타냅니다.
※ FromSeconds : 지정된 시간(초단위)를 나타내는 TimeSpan 반환
※ Stopwatch : 경과 시간을 측정하는데 사용할 수 있는 메서드와 속성 제공.

  1. 조건문의 측정한 시간값이 MAX TimeOut 변수를 초과할 시 While문 Break.
// 12V ON Flag가 false인 동안 기다리기(while반복문) 시작
// 다른 함수에서, 12V ON이 OK되면 해당 flag를 true로 바꿔주는 구문이 있다.
while (!Store.getInstance().flagReceive12VON)
{
	Thread.Sleep(10);
    // 측정한 시간이 Max 대기 시간을 초과하면...
	if (sw1.Elapsed > maxD)
	{
    	// 시간 측정 변수 정지
		sw1.Stop();
        // 시간 측정 flag false로 전환
		Store.getInstance().waitReceive12VON = false;
        // 서버에 PinCheck NG가 발생했다고 메시지 Send.
        if (Store.getInstance().client.IsConnected())
        {
		Store.getInstance().client.SendMessage("[CTACT,PINCHECK,NG]");
		}
        // 여기 if문 탈출
		break;
	}
    // 위에서 전환한 시간 측정 falg가 false면서,
	if (!Store.getInstance().waitReceive12VON)
	{
    	// 시간 측정 중이면,
		if (sw1.IsRunning)
		{
        // 측정 중단 후
		sw1.Stop();
        // 측정 초기화.
		sw1.Reset();
		}
		break;
	}
    //이외 사항에도 아직까지 시간 측정이 가동중이면,
	if (sw1.IsRunning)
	{
    	// 측정 중단 후
		sw1.Stop();
        // 측정 초기화.
		sw1.Reset();
	}
}

일단 허접한 알고리즘으로 구현 및 방어까지 해놨는데...
정상적으로 돌아가는 것을 확인했다.
일단 Demo SW를 배보해야 하므로 주석을 달아놓고,
추후 논리 설명 내용을 추가할 예정...

profile
초보개발세발자

0개의 댓글