unosquare / ffmediaelement

FFME: The Advanced WPF MediaElement (based on FFmpeg)
https://unosquare.github.io/ffmediaelement/
Other
1.17k stars 238 forks source link

Deadlock on Dispose #576

Closed igvk closed 11 months ago

igvk commented 2 years ago

Issue Title

Deadlock condition when Disposing CommandManager

Issue Categories

Version Information

Steps to Reproduce

Open media file, then close the player

Code

There exists deadlock condition in CommandManager.OnDisposing and ExecuteDirectCommand when there IsDirectCommandPending. PauseAsync eternally waits for the lock that is held by Dispose in the main thread.

WorkerBase.cs:

        protected virtual void Dispose(bool alsoManaged)
        {
            StopAsync().Wait();

            lock (SyncLock)
            {
            ...
                try { OnDisposing(); } catch { /* Ignore */ }
            ...
        }

        public Task<WorkerState> PauseAsync()
        {
            lock (SyncLock)
            {
            ...
        }

CommandManager.cs:

        protected override void OnDisposing()
        {
            ...
            // wait for any pending direct commands (unlikely)
            this.LogDebug(Aspects.EngineCommand, "Dispose is waiting for pending direct commands.");
            while (IsDirectCommandPending)
                Task.Delay(Constants.DefaultTimingPeriod).Wait();
            ...
        }

CommandManager.Direct.cs:

        private Task<bool> ExecuteDirectCommand(DirectCommandType command, Func<bool> commandDeleagte)
        {
            ...
                    PauseAsync().Wait();
            ...
        }
dbruning commented 2 years ago

I've seen this in a couple of dump files from my customer. Mario, do you have any intention to do a bugfix pass on this library? I would be happy to pay towards your time!

arq606 commented 2 years ago

Just encountered the same issue. Any hope to get the fix?

dbruning commented 2 years ago

I created a PR. If you can't wait for it to be included the main repo, and you want to build it yourself, my fork velogic/ffmediaelement has a couple of additional changes I had to make to build the dll on my machine.

stale[bot] commented 2 years ago

This issue has been automatically marked as stale because it has not had recent activity. Thank you for your contributions.