У меня есть кусок кода для проверки возможности воспроизведения списка мультимедиа. Проблема в том, что когда я запускаю метод и позволяю ему завершить sh или отменить его с помощью CancellationToken
, MediaPlayer
продолжает загружать контент и никогда не завершает работу, даже если у меня есть using
и вызову Dispose()
. Может быть, я делаю что-то не так ... Небольшая помощь очень ценится. Большое спасибо! Вот код:
CancellationTokenSource tokenSource = new CancellationTokenSource();
private async Task CheckMediaAsync(CancellationToken token)
{
using (MediaPlayer mediaplayer = new MediaPlayer { IsMuted = true, AutoPlay = true })
{
List<Link> links = DataAccess.GetAllMedia();
for (int i = 0; i < links.Count; i++)
{
mediaplayer.Source = MediaSource.CreateFromUri(new Uri(links[i].LinkMed));
if (await Task.Run(() => CheckUntilTimeout(token, mediaplayer), token))
{
OffileMedia.Add(links[i].Name);
}
if (tokenSource.IsCancellationRequested)
{
mediaplayer.Source = null;
mediaplayer.Dispose();
return;
}
}
mediaplayer.Source = null;
mediaplayer.Dispose();
}
}
private bool CheckUntilTimeout(CancellationToken ct, MediaPlayer mp)
{
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.Elapsed < TimeSpan.FromSeconds(8))
{
if (ct.IsCancellationRequested)
{
stopwatch.Stop();
return false;
}
if (mp.PlaybackSession.PlaybackState == MediaPlaybackState.None)
{
stopwatch.Stop();
return true;
}
else if (mp.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
{
stopwatch.Stop();
return false;
}
}
stopwatch.Stop();
return true;
}
Редактировать:
После некоторых других проверок кажется, что проблема действительно в MediaPlayer
объекте. Если я попытаюсь установить Source
в качестве аудиопотока, например:
http://icecast.unitedradio.it/Radio105.mp3
http://icecast.unitedradio.it/Virgin.mp3
или любой другой аудиопоток, MediaPlayer
продолжит загрузку каждого из них, даже если для Source
установлено значение null или Dispose()
это. Любопытно, что если попытаться любой поток видео (m3u8 or mpd)
, кажется, работает правильно.