중복으로 코드가 실행 될 가능성 문의

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

유저가 특정 행동 시 로그가 발생시키고 구매하는 함수를 만들었습니다.

근데 간헐적으로 로그가 연속으로 2번 발생되고 구매도 2번 되는 현상이 있는데요,

로직상으로는 문제가 없는 것 같은데 서버 쪽 문제와 관련이 있는 지 궁금합니다.

아래는 예시 함수입니다.

 private void 교환하기함수()
    {
        if (Is_Clicked)
            return;

        Is_Clicked = true;

        Param data = new Param();
        data.Add("교환횟수", $"{Current_Count}");
        data.Add("교환제물", 제물이름정보.ToString());

        SendQueue.Enqueue(Backend.GameLog.InsertLogV2, 로그이름,
            data, ReturnBro =>
            {
                if (ReturnBro.IsSuccess() == false)
                 //네트워크 오류
                else
                {
                 //구매성공
                }

                Is_Clicked = false;
            });
    }

안녕하세요 개발자님,
남겨주신 코드를 확인했을 때, 버튼 클릭 시 해당 함수가 호출되도록 구성하신 것으로 보입니다.
문의하신 간헐적 중복 발생 현상은 Is_Clicked 변수를 통해 중복실행을 방지하고는 있지만 SendQueue와 터치 입력의 미세한 시간 차로 인해 발생할 가능성이 매우 높습니다.

  1. 아주 짧은 찰나에 버튼이 두 번 클릭되면, 첫 번째 클릭에 의해 Is_Clicked가 true로 바뀌기 전에 두 번째 클릭 이벤트가 함수를 다시 호출할 수 있습니다.
  2. Is_Clicked = false; 처리가 서버 응답을 받은 후에 이루어지므로, 네트워크 지연이 발생할 경우 유저가 버튼을 다시 누를 수 있는 시간이 생깁니다.

함수 시작 시점에 button.interactable = false; 처리를 통해 클릭을 제한하거나
한 번 클릭된 후 일정 시간(예: 0.5초~1초) 동안은 아예 함수가 실행되지 않도록 시간 기반의 제한을 적용하시는 것을 권장드립니다.