Мой рабочий, кажется, заканчивает немедленно и не работает метод работы.
BackgroundWorker videoWorker;
...
videoWorker = new BackgroundWorker();
videoWorker.WorkerReportsProgress = true;
videoWorker.DoWork += new DoWorkEventHandler(VideoWorker_Work);
videoWorker.ProgressChanged += new ProgressChangedEventHandler(VideoWorker_ProgressChanged);
videoWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(VideoWorker_WorkCompleted);
...
private void VideoWorker_Work(object sender, DoWorkEventArgs e)
{
Console.WriteLine("SIR");
string[] imageLocations = Directory.GetFiles(videoFolderPath, "*.bmp");
VideoFileWriter writer = new VideoFileWriter();
writer.Open(videoFilePath, videoWidth, videoHeight, videoFPS);
int counter = 0;
foreach (string imageLocation in imageLocations)
{
Bitmap bmp = new Bitmap(imageLocation);
writer.WriteVideoFrame(bmp);
counter++;
videoWorker.ReportProgress((int) Math.Floor((double) counter / imageLocations.Count()));
Console.WriteLine("HI");
}
writer.Close();
Console.WriteLine("THERE");
}
private void VideoWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressDialog.ProgressValue = e.ProgressPercentage;
}
private void VideoWorker_WorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressDialog.Close();
Console.WriteLine("This ain't running biatch");
}
Он будет использоваться для компиляции изображений в видео. Кажется, нужно пропустить метод работы, и я не уверен, почему.
Вывод:
'TimeLapse.NET.vshost.exe' (CLR v4.0.30319: TimeLapse.NET.vshost.exe): Loaded 'C:\Users\Ryan\documents\visual studio 2013\Projects\TimeLapse.NET\TimeLapse.NET\bin\Debug\TimeLapse.NET.exe'. Symbols loaded.
Step into: Stepping over non-user code 'TimeLapse.NET.App..ctor'
'TimeLapse.NET.vshost.exe' (CLR v4.0.30319: TimeLapse.NET.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Step into: Stepping over non-user code 'TimeLapse.NET.App.Main'
Step into: Stepping over non-user code 'TimeLapse.NET.App.InitializeComponent'
'TimeLapse.NET.vshost.exe' (CLR v4.0.30319: TimeLapse.NET.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework.Aero2\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.Aero2.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'TimeLapse.NET.vshost.exe' (CLR v4.0.30319: TimeLapse.NET.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemXmlLinq\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemXmlLinq.dll'. Cannot find or open the PDB file.
'TimeLapse.NET.vshost.exe' (CLR v4.0.30319: TimeLapse.NET.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemXml\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemXml.dll'. Cannot find or open the PDB file.
'TimeLapse.NET.vshost.exe' (CLR v4.0.30319: TimeLapse.NET.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\UIAutomationTypes\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationTypes.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
This ain't running biatch
Изменение: это то, где он запускается
private void VideoStartButton_Click(object sender, RoutedEventArgs e)
{
if (videoFilePath != null && !videoFilePath.Equals(""))
{
if (videoFilePath != null && !videoFilePath.Equals(""))
{
videoHeight = Convert.ToInt32(VideoHeightInput.Text);
videoWidth = Convert.ToInt32(VideoWidthInput.Text);
videoFPS = Convert.ToInt32(FPSInput.Text);
progressDialog = new Progress();
progressDialog.Show();
videoWorker.RunWorkerAsync();
}
else
{
System.Windows.MessageBox.Show("Please select a source folder.");
}
}
else
{
System.Windows.MessageBox.Show("Please select a file to save.");
}
}
Похоже, что вы на самом деле не запускаете его после того, как вы его определите:
var videoWorker = new BackgroundWorker { WorkerReportsProgress = true };
videoWorker.DoWork += VideoWorker_Work;
videoWorker.ProgressChanged += VideoWorker_ProgressChanged;
videoWorker.RunWorkerCompleted += VideoWorker_WorkCompleted;
videoWorker.RunWorkerAsync();
Но так как вы получаете результат из метода WorkCompleted
, возможно, вы просто не опубликовали эту часть кода, а событие DoWork
самом деле бросает исключение.
В событии WorkCompleted
вы можете проверить, было ли исключено исключение в потоке:
private void VideoWorker_WorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
MessageBox.Show(e.Error.ToString());
else
MessageBox.Show("Nothing to see here. Move along.");
}
Кроме того, поместите точку DoWork
внутри события DoWork
и выполните ее во время выполнения.