Beispiel #1
0
        /// <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();
        }
Beispiel #2
0
 public OpenTask(OpenCallbackType callback)
 {
     _callback = callback;
 }