ffmediaelement
ffmediaelement copied to clipboard
Deadlock on Dispose
Issue Title
Deadlock condition when Disposing CommandManager
Issue Categories
- [x] Bug
Version Information
- [x] Build From Master branch, Commit bae88aa
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();
...
}
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!
Just encountered the same issue. Any hope to get the fix?
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.
This issue has been automatically marked as stale because it has not had recent activity. Thank you for your contributions.