Hallo,
ich habe ein Problem mit meinem Programm in dem ich Bilder verarbeiten muss. Da die Verarbeitung der Bilder etwas komplexer ist, und man mit dem Programm weiterarbeiten können sollte, habe ich für die Bildverarbeitung einen Backgroundworker verwendet.
Im Window_Loaded():
C#-Quelltext
1: 2: 3: 4: 5:
| backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted); |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.Message); } else if (e.Cancelled) { MessageBox.Show("Canceled"); } else { image1.Source = (ImageSource)e.Result; } } |
C#-Quelltext
1: 2: 3: 4:
| void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBarStatus.Value = e.ProgressPercentage; } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker;
e.Result = ReadObjects((string)e.Argument, worker, e);
if (worker.CancellationPending) { e.Cancel = true; } } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| RenderTargetBitmap ReadObjects(string path, BackgroundWorker worker, DoWorkEventArgs e) { BitmapImage bitmapImg = null; DrawingVisual drawingVisual = null; DrawingContext drawingContext = null; RenderTargetBitmap rtb = null;
drawingVisual = new DrawingVisual(); bitmapImg = new BitmapImage();
if (worker.CancellationPending) { e.Cancel = true; } else { drawingContext = drawingVisual.RenderOpen(); drawingContext.Close(); sqlConn.Close(); } rtb = new RenderTargetBitmap(2560, 2048, 96, 96, PixelFormats.Pbgra32); rtb.Render(drawingVisual); rtb.Freeze();
return rtb; } |
Also, das Programm in gekürzter Version.
Das Programm funktioniert auch, also bei einem Buttonclick wird der Backgroundworker aufgerufen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| try { if (!backgroundWorker.IsBusy) { backgroundWorker.RunWorkerAsync(lboxEingang.Items[0].ToString()); } } catch (Exception e) { MessageBox.Show(e.Message); } } |
Wenn ich jetzt aber zB im Windows auf ein anderes Programm wechsle und dann wieder zurückgehe zu meinem Programm, dann hängt dieses. kA warum das so ist? Wenn ich das Render.Open()... usw in ReadObjects() weglasse, dann hängt es komischerweise nicht?
Weiß jemand wo mein Fehler liegt?
Hoffe ich hab das Programm jetzt trotz der Kürzung, vollständig gepostet.
Gruß,
Tom
// Edit: Es liegt definitiv an folgendem:
C#-Quelltext
1:
| drawingContext = drawingVisual.RenderOpen(); |
Jemand eine Ahnung/Idee?
Moderiert von Christian S.: Highlight- durch C#-Tags ersetzt