Frage

...oder...

"Welches Böse in den Tiefen von WPF bin ich geweckt?"

Ich erstelle eine Leinwand auf einem Hintergrund -Thread und rendere ihn in eine Bitmap. Ich habe das seit über einem Jahr ohne Probleme im Produktionscode arbeiten. Ich mache Folgendes:

  • Erstellen Sie ein Canvas -Objekt
  • Erstellen Sie ein neues Namenscope -Objekt
  • Weisen Sie diesen Namenscope der Leinwand zu
  • Zeichnen Sie alles, was ich will, auf die Leinwand
  • Rufen Sie Canvas.Measure () mit der Größe der Leinwand an
  • Rufen Sie Canvas.arrage () mit dem verfügbaren Rekt der Leinwand an
  • Rufen Sie canvas.updatelayout () an
  • Rendern Sie die Leinwand

Im Ziehschritt habe ich immer nur Canvas genannt. Children.add (), um Uielements auf die Leinwand zu setzen. Das hat immer funktioniert.

Aus einem unerklärlichen Grund in einem bestimmten Fall in der Anwendung, an der ich arbeite, hängt der Anruf bei Canvas.Add () unbestimmt und blockiert meinen Hintergrund -Thread. Ich kann mir nichts vorstellen, was ich zwischen dem seit über einem Jahr arbeitenden Code und diesem einen bestimmten Fall anders mache.

Kann jemand mögliche Gründe vorschlagen, warum ein Anruf bei canvas.children.add () so hängen würde?

Bearbeiten: Der Hintergrund -Thread ist ein STA -Thread (das Hintergrund -Thread -Verarbeitungsmodell wurde eingerichtet, da ich Bilder mit WPF in einem MTA -Thread nicht verarbeiten konnte), sodass das Thread Apartment -Modell nicht der Schuldige sein sollte.

Bearbeiten #2: Während ich verstehe, warum die Leute vorschlagen, dass ich Dispatcher versuche.

  1. Ich möchte, dass meine Hintergrund -Thread -Verarbeitung in diesem Thread synchron ist. Mein Hintergrund -Thread hat eine Warteschlange, in die andere Threads Bildjobs einreichen, und mein Hintergrund -Thread verarbeitet jeden Job so, wie er sie erreicht. Die Verwendung von Dispatcher.BeginInvoke () fügt eine weitere Komplexitätsebene hinzu, die ich lieber vermeiden würde.
  2. Ich habe niemals benötigt bis jetzt. Wenn Sie diese Hintergrundverarbeitung synchron auf meinem Hintergrund -Thread machen hat funktioniert. Ich versuche festzustellen, was an diesem bizarren Randfall möglicherweise anders sein könnte, der dazu führt, dass dieser Code nicht funktioniert. Wenn ich es nicht zum Laufen bringen kann, werde ich diesen Verarbeitungscode ohne WPF umschreiben, was ich auch lieber vermeiden würde.
War es hilfreich?

Lösung

Welches Apartmentmodell verwenden Sie für Ihren Hintergrund -Thread?

Ich glaube, WPF muss auf dem STA -Thread laufen. Wenn Sie den Hintergrund -Thread hervorbringen, versuchen Sie es, Einstellungen zu erhalten. Es ist eine Wohnung nach STA.

Aktualisieren:

Wenn der STA -Thread nicht das Problem ist, würde ich versuchen, Ihre Leinwand in Stücke zu bringen. Grundsätzlich, wenn Sie a:

Dispatcher.Begininvoke (...)

Aus Ihrem Thread wird der bereitgestellte Delegierte auf die Rückseite der Dispatcher -Warteschlange gedrückt, sodass andere Warteschlangenaufgaben ausgeführt werden können.

Update 2:

Sie können auch versuchen, in den Quellcode für das Canvas -Objekt mithilfe der Referenzquellen von .NET Framework zu debuggen. Sie können dies aktivieren, indem Sie in den Debugging-Optionen unter Tools-> Optionen "aktivieren .NET .NET-Framework-Quelle" aktivieren.

Andere Tipps

Versuchen Sie, Dispatcher.run () im Hintergrund -Thread anzurufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top