Exemple #1
0
        public async Task <bool> CloseAsync(object args = null)
        {
            if (!_isOpen)
            {
                return(await RunFunctionIfOpenAsyncA(delegate { IsEnabledAllowed = false; }).ConfigureAwait(false));
            }

            lock (_ctsLocker)
            {
                _cts?.CancelSafe(true);
            }

            try
            {
                await _isOpenSemaphore.WaitAsync().ConfigureAwait(false);

                if (_isOpen)
                {
                    lock (_ctsLocker)
                    {
                        _cts?.Dispose();
                        _cts       = null;
                        _cancToken = new CancellationToken(true); // CancellationToken is not nullable and not disposable
                    }

                    await UnregisterBackEventHandlersAsync();

                    IsEnabledAllowed = false;
                    IsOpen           = false;

                    await CloseMayOverrideAsync(args).ConfigureAwait(false);

                    return(true);
                }
            }
            catch (Exception ex)
            {
                if (SemaphoreSlimSafeRelease.IsAlive(_isOpenSemaphore))
                {
                    await Logger.AddAsync(GetType().Name + ex.ToString(), Logger.ForegroundLogFilename);
                }
            }
            finally
            {
                lock (_isOpenSemaphoreLocker)
                {
                    SemaphoreSlimSafeRelease.TryDispose(_isOpenSemaphore);
                    _isOpenSemaphore = null;
                }
            }
            return(false);
        }