public Task Encode(string originalFile, string outputFile, int start, int end, IProgress <EncodeProgress> encodeProgresss, CancellationToken cancelToken) { var taskCompletionSource = new TaskCompletionSource <bool>(); var instance = new HandBrakeInstance(); instance.Initialize(1); instance.ScanCompleted += (o, args) => { try { if (start >= end) { throw new Exception("Invalid start and end times."); } var sourceTitle = instance.Titles.TitleList.FirstOrDefault(); if (sourceTitle == null) { throw new Exception("Could not read input video."); } var settings = GetDefaultSettings(); settings.Destination.File = outputFile; dynamic resolution = settings.Filters.FilterList.First(filter => filter.ID == 11).Settings; resolution.width = sourceTitle.Geometry.Width; resolution.height = sourceTitle.Geometry.Height; settings.Source.Range.Start = start * 90000; settings.Source.Range.End = end * 90000; settings.Source.Path = originalFile; cancelToken.Register(() => instance.StopEncode()); instance.StartEncode(settings); } catch (Exception e) { taskCompletionSource.TrySetException(e); } }; instance.EncodeProgress += (o, args) => NewMeth(args, encodeProgresss); instance.EncodeCompleted += (o, args) => { try { if (args.Error) { if (cancelToken.IsCancellationRequested) { throw new Exception("Encoding was canceled"); } throw new Exception("Encoding failed. I don't know why 'cause this API kinda sucks"); } taskCompletionSource.TrySetResult(true); } catch (Exception e) { taskCompletionSource.TrySetException(e); } }; instance.StartScan(originalFile, 1, TimeSpan.Zero, 1); return(taskCompletionSource.Task); }