안녕하세요.
요청해주신 트랜잭션을 요청하는 코드 조각입니다.
해당 코드 내에서 딕셔너리를 루프하는 코드는 코드 아래쪽에 첨부한
'GoodTemp’를 만들 때 이외에는 없는 것으로 확인했습니다.
혹시 더 확인이 필요한 부분이 있으면 이야기 부탁드리겠습니다.
List<TransactionValue> transactionList = new List<TransactionValue>();
// 변경된 데이터만큼 트랜잭션 추가
foreach (var gameData in gameDatas)
{
transactionList.Add(gameData.GetTransactionUpdateValue());
}
// 콜백이 60초내에 정상적으로 왔는지 체크
CancellationTokenSource cts = new CancellationTokenSource();
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
cts.CancelAfter(TimeSpan.FromSeconds(60));
// 트랜잭션 요청
SendQueue.Enqueue(Backend.GameData.TransactionWriteV2, transactionList, callback => {
Debug.Log($"Backend.BMember.TransactionWriteV2 : {callback}");
if (callback.IsSuccess())
{
tcs.TrySetResult(true);
}
else
{
tcs.TrySetResult(false);
Debug.Log("저장 실패");
// ..... 게임 종료 로직
}
});
try
{
// Task가 완료되거나 취소되기를 기다림
bool result = await Task.WhenAny(tcs.Task, Task.Delay(Timeout.Infinite, cts.Token)) == tcs.Task && tcs.Task.Result;
if (!result)
{
Debug.LogWarning("저장 실패: 서버 응답이 60초 내에 도착하지 않았습니다.");
// 트랜잭션 요청에 대한 리스폰스가 없어 게임 종료
}
}
catch (OperationCanceledException)
{
Debug.LogWarning("저장 실패: 서버 응답이 60초 내에 도착하지 않았습니다.");
// 예외 시 게임 종료
}
finally
{
cts.Dispose();
}
/// GetParm 관련 코드
public TransactionValue GetTransactionUpdateValue() {
return TransactionValue.SetUpdateV2(GetTableName(), GetInDate(), Backend.UserInDate, GetParam());
}
public override Param GetParam() {
Param param = new Param();
// ----------생략--------------
if (TrainingStatList != null && TrainingStatList.Count > 0)
param.Add("TrainingStatList", TrainingStatList);
if (LevelUpStatList != null && LevelUpStatList.Count > 0)
param.Add("LevelUpStatList", LevelUpStatList);
if (RankStatList != null && RankStatList.Count > 0)
param.Add("RankStatList", RankStatList);
if (HorseStatList != null && HorseStatList.Count > 0)
param.Add("HorseStatList", HorseStatList);
if (PagiStatList != null && PagiStatList.Count > 0)
param.Add("PagiStatList", PagiStatList);
param.Add("AttackAdsLevel", AttackAdsLevel.GetDecrypted());
param.Add("HpAdsLevel", HpAdsLevel.GetDecrypted());
param.Add("GoldAdsLevel", GoldAdsLevel.GetDecrypted());
param.Add("ExpAdsLevel", ExpAdsLevel.GetDecrypted());
Dictionary<int, float> GoodTemp = new Dictionary<int, float>();
Dictionary<int, ObscuredFloat>.KeyCollection keys = GoodsDicts.Keys;
foreach(int key in keys)
{
if(GoodTemp.ContainsKey(key) == true)
GoodTemp[key] += GoodsDicts[key];
else
GoodTemp.Add(key, GoodsDicts[key]);
}
param.Add("GoodsDicts", GoodTemp);
return param;
}