private async void CheckAsync_Click(object sender, RoutedEventArgs e) { ExcelStatic.StartTask(); MediaInfoChecker mediaDurationChecker = new MediaInfoChecker() { ResultOffSet = ExcelStatic.ResultOffset, CheckDuration = this.CheckDuration.IsChecked.HasValue ? (bool)this.CheckDuration.IsChecked : false, CheckHasVideo = this.CheckHasVideo.IsChecked.HasValue ? (bool)this.CheckHasVideo.IsChecked : false, CheckHasAudio = this.CheckHasAudio.IsChecked.HasValue ? (bool)this.CheckHasAudio.IsChecked : false, CheckResolution = this.CheckResolution.IsChecked.HasValue ? (bool)this.CheckResolution.IsChecked : false }; mediaDurationChecker.Reportor.ProgressChange += Reportor_ProgressChange; mediaDurationChecker.Reportor.MessageChange += Reportor_MessageChange; CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.Token.Register(() => ExcelStatic.EndTask()); this.Unloaded += (object s, System.Windows.RoutedEventArgs routedEventArgs) => { cancellationTokenSource.Cancel(); }; try { await mediaDurationChecker.StartAsync(cancellationTokenSource.Token); } catch (Exception Ex) { System.Windows.Forms.MessageBox.Show(Ex.Message); } finally { ExcelStatic.EndTask(); } }
private async void SplitButtonMediaDuration_Click(object sender, RibbonControlEventArgs e) { //我有点搞不懂了 //如果这个事件处理程序作为Async void方法,在Ribbon里直接运行,就会有大量内存无法释放 //但改成普通void方法,在方法内部用action封装一个async方法运行,就不会出现内存无法释放的情况 //Action action = async() => // { ExcelStatic.StartTask(); MediaInfoChecker mediaDurationChecker = new MediaInfoChecker() { ResultOffSet = this.OffSet, CheckDuration = true }; CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); StatusForm statusForm = new StatusForm(); statusForm.Show(); mediaDurationChecker.Reportor.MessageChange += statusForm.ChangeMessage; mediaDurationChecker.Reportor.ProgressChange += statusForm.ChangeProgress; statusForm.FormClosing += (object s, System.Windows.Forms.FormClosingEventArgs formClosingEventArgs) => cancellationTokenSource.Cancel(); cancellationTokenSource.Token.Register(() => ExcelStatic.EndTask()); try { await mediaDurationChecker.StartAsync(cancellationTokenSource.Token); } catch (Exception Ex) { System.Windows.Forms.MessageBox.Show(Ex.Message); } finally { mediaDurationChecker.Reportor.MessageChange -= statusForm.ChangeMessage; mediaDurationChecker.Reportor.ProgressChange -= statusForm.ChangeProgress; mediaDurationChecker = null; System.GC.Collect(); ExcelStatic.EndTask(); } // }; //action.Invoke(); }