Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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();
        }