/// <summary> /// セッションのオープン操作をおこなうコルーチンを返却します。<br /> /// <br /> /// コルーチンの完了時にはコールバックが返っていることが保証されます。<br /> /// ただし、オープン状態のセッションは外部要因によって予期せずクローズされることがあるため、オープン操作成功のコールバックが返った時点でも、セッションが確実にオープン状態であることは保証されません。<br /> /// <br /> /// セッションのオープン操作は、オープン途中やすでにオープン状態のセッションに対しても重ねておこなうことができます。<br /> /// </summary> /// /// <returns>IEnumerator</returns> /// <param name="callback">コールバックハンドラ</param> public IEnumerator Open(OpenCallbackType callback) { var openTask = new OpenTask(callback); using (var scopedLock = new NonreentrantLock.ScopedLock(_lock)) { if (_state == State.Available) { openTask.Complete(new AsyncResult <OpenResult>(new OpenResult(), null)); } else { _openTaskList.Add(openTask); while (true) { if (openTask.IsCompleted) { break; } IEnumerator current = null; if (_state == State.Idle) { _state = State.Opening; if (Credential is BasicGs2Credential) { current = OpenImpl(); } else if (Credential is ProjectTokenGs2Credential) { using (var scopedUnlock = new NonreentrantLock.ScopedUnlock(_lock)) { OpenCallback(Credential.ProjectToken, null); } } } using (var scopedUnlock = new NonreentrantLock.ScopedUnlock(_lock)) { yield return(current); } } } } openTask.InvokeCallback(); }
public OpenTask(OpenCallbackType callback) { _callback = callback; }