public override async Task <bool> TaskAsync(Dummy dummy, TestConfig config)
        {
            bool isSuccess = false;

            config.ScenarioName = "Repeat Echo";

            var testStartTime = DateTime.Now;

            dummy.StartScenario();

            var roomNumber = EnterRoomNumber(RoomBaseInfo.MaxUserCount, dummy.Number);
            var enterRet   = await RequestAndPacketProcess.MTConnetToRoomEnter(dummy, roomNumber);

            if (enterRet.Ret == false)
            {
                dummy.SetScenarioResult(false, $"Fail - [MTConnetToRoomEnter] {enterRet.ErrStr}");
                return(isSuccess);
            }


            while (DummyManager.InProgress)
            {
                if (dummy.IsRun == false)
                {
                    return(isSuccess);
                }

                dummy.SetScenariActionMaxWaitTime(Utils.CurrentTimeSec() + 8);


                var chatRet = await RequestAndPacketProcess.RoomChatAsync(dummy);

                if (chatRet.Ret == false)
                {
                    dummy.SetScenarioResult(false, $"Fail - [RoomChat] {chatRet.ErrStr}");
                    break;
                }

                DummyManager.AddDummyIteration();

                var elapsedTime = DateTime.Now - testStartTime;
                if (Utils.IsCompletedRepeatTask(ref dummy.CurActionRepeatCount, config, elapsedTime.TotalSeconds))
                {
                    isSuccess = true;
                    break;
                }
            }


            dummy.DisConnect();

            if (isSuccess)
            {
                dummy.SetScenarioResult(true, "Success");
            }

            return(isSuccess);
        }
        public override async Task <bool> TaskAsync(Dummy dummy, TestConfig config)
        {
            bool isSuccess = false;

            config.ScenarioName = "Repeat Echo";

            var testStartTime = DateTime.Now;

            dummy.StartScenario();

            while (DummyManager.InProgress)
            {
                if (dummy.IsRun == false)
                {
                    return(isSuccess);
                }

                // 1 루프 사이에 최대 대기 시간을 걸어 놓도록 한다. 외부에서 이 대기 시간을 넘으면 자동 취소 시킨다
                dummy.SetScenariActionMaxWaitTime(Utils.CurrentTimeSec() + 8);


                var connRet = await dummy.ConnectAsyncAndReTry();

                if (connRet.Result == false)
                {
                    dummy.SetScenarioResult(false, $"Fail - [Connect] Code({connRet.ErrorCode}), {connRet.ErrorStr}");
                    return(isSuccess);
                }

                var loginRet = await RequestAndPacketProcess.LoginAsync(dummy);

                if (loginRet.Ret == false)
                {
                    dummy.SetScenarioResult(false, $"Fail - [Login] {loginRet.ErrStr}");
                    return(isSuccess);
                }

                dummy.DisConnect();

                DummyManager.AddDummyIteration();

                var elapsedTime = DateTime.Now - testStartTime;
                if (Utils.IsCompletedRepeatTask(ref dummy.CurActionRepeatCount, config, elapsedTime.TotalSeconds))
                {
                    isSuccess = true;
                    break;
                }
            }

            if (isSuccess)
            {
                dummy.SetScenarioResult(true, "Success");
            }

            return(isSuccess);
        }