示例#1
0
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public override void Close()
        {
            if (!isClosed)
            {
                if (IsAsync)
                {
                    AsyncDispose dispose = new AsyncDispose(delegate(KdtAdapter adapter)
                    {
                        var oracleadapter = adapter as OracleClientAdapter;
                        while (oracleadapter.IsAsync)
                        {
                            Thread.Sleep(1000);
                        }

                        if (oracleadapter._oracleTran != null)
                        {
                            oracleadapter._oracleTran.Rollback();
                        }

                        if (oracleadapter._oracleCn != null)
                        {
                            oracleadapter._oracleCn.Close();
                            oracleadapter._oracleCn.Dispose();
                        }

                        GC.SuppressFinalize(oracleadapter);
                    });
                    dispose.BeginInvoke(this, delegate(IAsyncResult result)
                    {
                        var async = result.AsyncState as AsyncDispose;
                        async.EndInvoke(result);
                    }, dispose);
                }
                else
                {
                    if (_oracleTran != null)
                    {
                        _oracleTran.Rollback();
                    }

                    _oracleCn.Close();
                    _oracleCn.Dispose();

                    base.Dispose();
                }
            }
            isClosed = true;
        }
示例#2
0
    public IEnumerator MangedTest()
    {
        using (var tester = new Tester())
        {
            var       counter = new Counter();
            BootParam prm     = new BootParam();
            prm.BootContents.Add(new MainTestParam {
                Counter = counter
            });
            yield return(WrapTask(tester.Controller.Boot(prm)));

            var manded = tester.Controller.Get <IHasManagedHolder>();

            bool dispose = false;
            // disposed時にアクションを発火するように登録
            var action = manded.Manage(() => dispose = true);
            Assert.IsFalse(dispose);
            //Unmanageで解放される
            manded.Unmanage(action);
            Assert.IsTrue(dispose);

            //再登録
            dispose = false;
            manded.Manage(() => dispose = true);
            //非同期を登録
            var asyncDispose = new AsyncDispose();
            manded.ManageAsync(asyncDispose);
            tester.Message(MainTestContent.Event.Switch, counter);

            //直ぐには実行されない
            Assert.IsFalse(asyncDispose.Disposed);

            yield return(counter.Wait("Run", 2));

            yield return(tester.Close());

            Assert.IsTrue(dispose);
            Assert.IsTrue(asyncDispose.Disposed);
        }
    }