public void rpc_PlayGame(PlayGameRequest req, OnRpcReturn <PlayGameResponse> callback) { // <--- 此处如果不加锁,假如同时两个PlayGameRequest过来,则可能会导致coinCount为负数 this.coinLocker.LockAsync().ContinueWith((_lock) => { //判断硬币数量够不够 if (coinCount > req.count) { //异步调用,消耗硬币 machine.Call <PlayGameResponse>(req, new OnRpcReturn <PlayGameResponse>((rsp, err) => { //消耗硬币 coinCount -= rsp.usedCoin; //返回结果 callback(rsp); _lock.Dispose(); })); } else { //返回失败结果 callback(new PlayGameResponse() { s2c_code = Response.CODE_ERROR }); _lock.Dispose(); } }); }
public async Task <PlayGameResponse> rpc_PlayGameAsync(PlayGameRequest req) { // <--- 此处如果不加锁,假如同时两个PlayGameRequest过来,则可能会导致coinCount为负数 using (await this.coinLocker.LockAsync()) { //判断硬币数量够不够 if (coinCount > req.count) { //异步调用 var rsp = await machine.CallAsync <PlayGameResponse>(req); //消耗硬币 coinCount -= rsp.usedCoin; //返回结果 return(rsp); } //返回失败结果 return(new PlayGameResponse() { s2c_code = Response.CODE_ERROR }); } }