public void OnMessage(Gs2SessionTaskId gs2SessionTaskId, Gs2Response gs2Response) { using (var scopedLock = new NonreentrantLock.ScopedLock(_lock)) { _gs2SessionTaskList.Find(v => v.Gs2SessionTaskId == gs2SessionTaskId)?.Complete(gs2Response); } }
private void CompleteGs2SessionTasks(Gs2Response gs2Response) { foreach (var gs2SessionTask in _gs2SessionTaskList) { gs2SessionTask.Complete(gs2Response); } }
public void Complete(Gs2Response gs2Response) { if (_gs2Response != null) { // タイムアウトやキャンセルと応答が入れ違いになったとしても、最初に決めた結果を採用する } else if (_isCancelled) { // キャンセルがかけられていれば、実際の応答が何であれ、キャンセルによる失敗として扱う _gs2Response = new Gs2Response(new SessionNotOpenException("Cancelled.")); } else if (DateTime.Now >= _timeLimit) { // タイムアウトしていれば、実際の応答が何であれ、タイムアウトによる失敗として扱う _gs2Response = new Gs2Response(new RequestTimeoutException("The request timed out.")); } else { _gs2Response = gs2Response; } }
// Gs2Session の実行中タスクの登録からはずれたあとに、 Gs2Session のロックの外から呼ぶ public void InvokeCallback(Gs2Response gs2Response = null) { InvokeCallbackImpl(gs2Response ?? _gs2Response); }
protected abstract void InvokeCallbackImpl(Gs2Response gs2Response);