vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
aus einem anderen Thread auf ein WPF-Window - oder wo ist der Dispatcher?! 
Autor: MikeJ
Datum: 28.10.10 21:22

Hallo zusammen

ich habe mir in meiner WPF-Anwendung aus Design- und Funktionalitäts-Gründen eine eigene MessageBox zur Meldungsausgabe gebastelt. Das Teil funktioniert soweit sehr gut, solange alles in dem Thread abläuft der auch auf die UI zugreifen darf.
Da aber bekanntlich auch Hintergrund-Threads Fehler erzeugen können und ich diese auch ausgeben will muss ich zur Meldungsausgabe den Thread wechseln. Bisher habe ich das mit 2 verschiedenen Aufrufen realisiert "mybox.ShowDialog(...)" und "mybox.ShowDialogThread(...)" - die zweite sorgt wie der name schon sagt für den nötigen Thread Wechsel.
Meine erste Frage: kann ich in der Sub "ShowDialog" irgendwie feststellen ob ich der aufrufende Thread zugriff auf die UI hat?! Denn dann könnte ich mir den separaten Aufruf mittels "ShowDialogThread" sparen?

Meine 2 Frage ist: Wie komme ich aus einem Hintergrund-Thread an den Dispatcher für das UI?!
Ich habe mir bisher einen kleinen "Workaround" gebastelt der mir aber nicht gefällt:
Beim Start der Anwendung schreibe ich mir den UI-Dispatcher in eine globale Variable. In "ShowDialogThread" nutze ich dann diese Variable wieder für den Invoke:
Public Class myWindow
 
    Public Sub New()
    ...
    DispatcherSaver.MainWindowDispatcher = Me.Dispatcher 'Den Dispatcher für 
    ' spätere Zugriffe speichern
    ...
    End Sub
 
    ...
 
End Class
Public Class mybox
 
    ...
 
    Delegate Sub CallErr(...)
 
    Public Sub ShowDialogThread(...)
        Dim del As New CallErr(AddressOf ShowDialog)
        ...
        MainWindowDispatcher.Invoke(del, objArr)
    End Sub
 
    ...
 
End Class
 
Public Module DispatcherSaver
    Public MainWindowDispatcher As Dispatcher 'Hier wird der Dispatcher 
    ' gespeichert
End Module
Ich hoffe, man kann verstehen was mein Problem ist

Viele Grüße
Mike
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: aus einem anderen Thread auf ein WPF-Window - oder wo ist der Dispatcher?! 
Autor: Maas
Datum: 28.10.10 21:47

Probier mal:
        If Me.Dispatcher.CheckAccess() Then
 
        End If
 
        'oder
 
        If Me.CheckAccess Then
 
        End If
CheckAccess wird nicht von IntelliSense unterstützt, existiert aber trotzdem. Die Funktion wird aber von jedem Control zur Verfügung gestellt, also kann man sich dabei auch den Dispatcher sparen (welchen man bei Invoke ja wieder braucht).
Zu Frage 2: mybox ist doch ein Control (Window), oder? Dann nimm doch den Dispatcher des Controls. Alle Control-Dispatcher haben imho den gleichen UI-Thread.

Maas
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: aus einem anderen Thread auf ein WPF-Window - oder wo ist der Dispatcher?! 
Autor: MikeJ
Datum: 28.10.10 22:07

Hi

Das Problem ist, dass vor dem Anzeigen der myBox diese zuerst mittels 'New' instantiiert werden muss. Ist das ein anderer Thread geht das schon nicht (wegen MyBase.New und InitializeComponent).
Ich hätte mir gerne eine kleine "Aufrufer-Klasse" gemacht und in dieser dann geprüft welcher Thread es ist um dann entweder direkt "ShowDialog" oder entsprechend "ShowDialogThread" aufzurufen. Die 'Aufrufer-Klasse' hat aber dann immer die gleiche Methode für den Aufruf.
In der Aufrufer-Klasse würde dann wiederum Me.Dispatcher... nicht funktionieren.

Gruß Mike
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel