public void Destroy() { lock (this) { if (!_isValid) { return; } _isValid = false; try { OnDestroy?.Invoke(this); } catch (Exception e) { _logger?.WriteException(e); } } _timerManager.Destroy(); _objectCache.Destroy(); _typeDB.Destroy(); GC.Collect(); GC.WaitForPendingFinalizers(); ExecutePendingActions(); // _rwlock.EnterWriteLock(); for (int i = 0, count = _contextRefs.Count; i < count; i++) { var contextRef = _contextRefs[i]; contextRef.target.Destroy(); } _contextRefs.Clear(); _mainContext = null; // _rwlock.ExitWriteLock(); if (_asyncManager != null) { _asyncManager.Destroy(); _asyncManager = null; } JSApi.JS_FreeRuntime(_rt); var id = _runtimeId; _runtimeId = -1; _rt = JSRuntime.Null; try { OnAfterDestroy?.Invoke(id); } catch (Exception e) { _logger?.WriteException(e); } }