我有一个改变字段的线程
private void SongChange(object sender, RoutedEventArgs e)
{
SongChangeAction();
songLength = (int)BGMPlayer.NaturalDuration.TimeSpan.TotalSeconds;
songProgress = new Thread(SongProgressUpdate) { IsBackground = true };
songProgress.Start();
}
private void SongProgressUpdate()
{
while (true)
{
Dispatcher.Invoke(() => { workingResources.SongProgress = BGMPlayer.Position.TotalSeconds / songLength * 100; });
Thread.Sleep(1000);
}
}
注意:qazxsw poi是qazxsw poi,qazxsw poi是在背景中播放音乐的qazxsw poi,songLength
是double
绑定到BGMPlayer
当我使用“X”按钮或任务栏关闭程序时,程序抛出异常MediaElement
即使我尝试设置线程workingResources.SongProgress
但它不会抛出异常如果我使用Visual Studio停止程序。行中的程序抛出异常:
double
我可以通过使用try / catch来阻止它,但我想找到更高效的东西
尝试使用Microsoft的Reactive Framework。然后你可以这样做:
Progress Bar
您只需要确保在关闭应用程序时保存对System.Threading.Tasks.TaskCanceledException
的引用并在其上调用IsBackground = true
。
NuGet“System.Reactive”和“System.Reactive.Windows.Threading”,并将Dispatcher.Invoke(() => { workingResources.SongProgress = BGMPlayer.Position.TotalSeconds / songLength * 100; });
添加到您的代码中。
尝试在窗口关闭时使用private void SongChange(object sender, RoutedEventArgs e)
{
SongChangeAction();
songLength = (int)BGMPlayer.NaturalDuration.TimeSpan.TotalSeconds;
IDisposable subscription =
Observable
.Interval(TimeSpan.FromSeconds(1.0))
.ObserveOnDispatcher()
.Subscribe(x => workingResources.SongProgress = BGMPlayer.Position.TotalSeconds / songLength * 100);
}
:
subscription