비동기 형태의 데이터 전송에 관해 문의드립니다.

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

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

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

  • 뒤끝 SDK 버전 :
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :
 public static async Task<bool> BE_DataAllPost(User_Data userdata)
    {
        try
        {
            List<Task> tasks = new List<Task>()
            {
               BackEnd_As_Post("User", UserDataList(userdata)),
               BackEnd_As_Post("Drone", DroneData()),
               BackEnd_As_Post("Unit",  UnitData()),
               BackEnd_As_Post("Player",  PlayerData()),
               BackEnd_As_Post("Quest",  QuestData()),
               BackEnd_As_Post("Iteminfo", ItemInfoData()),
               BackEnd_As_Post("ChapterInfo",  ChapterInfoData()),
            };

            await Task.WhenAll(tasks);

            return true;
        }
        catch (Exception e)
        {
            print($"문제발생: {e}");
            return false;
        }
    }

    public static async Task<bool> BackEnd_As_Post(string TalbeName = "", Param param = null)
    {
        var bro = new TaskCompletionSource<BackendReturnObject>();

        // 비동기로 테이블에서 데이터 가져오기
        Backend.PlayerData.GetMyData(TalbeName, (callback) => {bro.SetResult(callback); });

        // 데이터 가져온 결과
        var result = await bro.Task;

        // 데이터 가져오는데 실패할 경우
        if (!result.IsSuccess())
        {
            return false;
        }

        // Json으로 리턴된 데이터를 받아오기
        LitJson.JsonData gameDataJson = result.FlattenRows();

        // 리턴된 데이터가 없을 경우
        if (gameDataJson.Count == 0)
        {
            //// 비동기로 해당 테이블에 데이터 생성
            Backend.PlayerData.InsertData(TalbeName, param, (callback) => {bro.SetResult(callback); });

            //// 데이터 생성 결과
            result = await bro.Task;

            return result.IsSuccess();

        }
        else
        {
            // 비동기로 해당 테이블 데이터 갱신하기
            Backend.GameData.UpdateV2(TalbeName, result.GetInDate(), Backend.UserInDate, param, (callback) => { bro.SetResult(callback); });

            // 데이터 전송한 결과
            result = await bro.Task;

            //결과 반환
            return result.IsSuccess();

        }
    }

위와 같은 2개의 함수를 생성하고 실행할 경우

InvalidOperationException
GkmxU2tr5W0K10Fac8R.ivJcGutIdnbV5vQ3g7G.mN3tdbKj2M () (at :0)
BackEnd.Backend.AsyncPoll () (at :0)

오류가 발생합니다.
혹시 해당 오류가 발생하지 않도록 하는 방법이 있을까요?

안녕하세요 개발자님,
문의해 주신 내용 관련하여 상세 확인 후 안내드릴 수 있도록 하겠습니다.
안내까지 다소 시간이 소요될 수 있는 점 양해 부탁드립니다.

안녕하게요 혹시 오류를 어떻게 해결 해야 하는지 알 수 있을까요?

기다려주셔서 감사합니다.

뒤끝 초기화시 인자값 useAsyncPoll 은, 외부 스레드에서 처리된 뒤끝 요청에 대한 콜백을 외부 스레드에서 처리할지 메인 스레드로 가져올지 입니다.
true일 경우, 메인 스레드로 가져오게 됩니다.
외부 스레드에서는 유니티 함수 사용이 불가능하기 때문에, AsyncPoll이 외부 스레드에서 작동하게 되면서 에러가 발생하는 것으로 보입니다.
따라서, 다음과 같이 useAsyncPoll을 false로 하셔야 합니다.
다만 그럴경우, 다른 뒤끝 비동기 함수의 콜백에서 유니티 함수에 접근할 경우 에러가 발생합니다.

Backend.Initialize(false);

혹은 Task를 사용하실 때 동기함수를 사용하실 수 있습니다.
Task를 통해 외부 쓰레드에서 작동함에 따라 동기함수를 사용해도 유니티가 중지되지는 않습니다.

   public static async Task<bool> BackEnd_As_Post(string TalbeName = "", Param param = null)
    {
        var bro = new TaskCompletionSource<BackendReturnObject>();

        // 데이터 가져온 결과
        var result =  Backend.PlayerData.GetMyData(TalbeName);

        // 데이터 가져오는데 실패할 경우
        if (!result.IsSuccess())
        {
            return false;
        }

task로 동기함수를 사용할 경우
async / await를 사용한 비동기 함수처럼 여러개를 한번에 실행은 불가능할 것인가요?

동기 함수가 들어간 Task는 비동기로 실행되므로 동시 실행이 가능합니다.
단 6개 이상을 한번에 요청하는 경우 요청 응답이 오지 않거나 응답이 굉장히 오랜시간 뒤에 올 수 있습니다. (약 2~5분)
최대 동시 호출 수는 8개 입니다. 참고하여 주시면 감사하겠습니다.

위에서 알려주신 방법으로 코드를 구현할 경우 기존에 사용하던 비동기 형태로 불러오는 함수를 모두 동기 형태로 벼경하고, async / awaite 를 사용하여 비동기 형태로 구현후 실행하면 요청 응답으로 인해 랙이 발생하는 경우가 있습니다.

추가로

var bros = new TaskCompletionSource();
// 비동기로 해당 테이블 데이터 갱신하기
Backend.GameData.UpdateV2(TalbeName, result.GetInDate(), Backend.UserInDate, param, (callback) =>
{
bros.SetResult(callback.IsSuccess()); // 재시도를 위해 true 설정
});

        //결과 반환
        return await bros.Task

분명 action으로 해서 다처리하고 나와서 하는건데 실행할 경우에 에러가 나는지 이해가 안되어서 그러는데 설명해주실 수 있을까요?

다음과 같이 Task를 통해 백그라운드에서 비동기로 호출하도록 설정할 수 있습니다.

Task.Run(async () =>
{
    bool result = await BE_DataAllPost();
});

앞서 올려주신 비동기로 구현한 함수의 경우,
처음 할당받았던 bros가 초기화가 되지 않은 채로 var result = await bro.Task; 를 계속 통과하여,
Task가 끝난 후 뒤끝 비동기 함수가 bro를 할당하려다 발생하는 문제로 추정됩니다.
이에, 뒤끝 함수를 호출하기 전에 bros의 값을 초기화해주어 await bro.Task를 기다리도록 해주어야 합니다.