/// <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; }
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); } }