System.Threading.Tasks.TaskCanceledException:'任务被取消了。'关闭应用程序时

问题描述 投票:0回答:2

我有一个改变字段的线程

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,songLengthdouble绑定到BGMPlayer

当我使用“X”按钮或任务栏关闭程序时,程序抛出异常MediaElement即使我尝试设置线程workingResources.SongProgress但它不会抛出异常如果我使用Visual Studio停止程序。行中的程序抛出异常:

double

我可以通过使用try / catch来阻止它,但我想找到更高效的东西

c# multithreading exception
2个回答
1
投票

尝试使用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; }); 添加到您的代码中。


1
投票

尝试在窗口关闭时使用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
© www.soinside.com 2019 - 2024. All rights reserved.