Autor Beitrag
Kouran
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Gentoo Linux x86 2.6.22, WinXP
C#, Java, Pascal, Lisp, Vim ,VS2k5(VimEmu)
BeitragVerfasst: Fr 13.07.07 09:39 
hallo,
ich verstehe eine exception die mir der compiler wirft nicht ganz:

"der aufgerufene thread kann nicht auf dieses obekt zugreifen, da sich das objekt im besitz eines anderen threads befindet"

dies is des quelltext eines fensters des media players. was im prinzip passieren soll ist, dass sobald die methode Refresh() aufgerufen wird, soll im hintergrund information aus dem netz geladen werden und sobald sie fertig ist mit dem download soll sie in den feldern Lyrics / Description und Cover angezeigt werden. das downloaden im hintergrund funktioniert einwandfrei, auch das zuweisen des return wertes des hinergrundthreads an das lokale objekt infoWrapper funktioniert. allerdings sobald ich in irgend einer form versuche auf die felder Lyrics.text etc schreibend zuzugreifen, wird immer obige exception geworfen.

hat irgend jemand vielleicht eine idee woran das liegen könnte?

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
 public partial class Info
    {
        private Window1 mainWindow;
        private PeerPlayerCore qpCore;

        private delegate InfoWrapper del_Refresher();
        private static del_Refresher invoker;
        
        private InfoWrapper infoWrapper;

        public Info(Window1 mainWindow, PeerPlayerCore qpCore)
        {
            this.InitializeComponent();

            this.mainWindow = mainWindow;
            this.ShowInTaskbar = false;
            this.qpCore = qpCore;

            infoWrapper = new InfoWrapper();

        }

        private void Move(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            this.DragMove();
        }

        private void Btn_Close_Click(object sender, RoutedEventArgs e)
        {
            this.Visibility = Visibility.Collapsed;
            mainWindow.Vis_infoWindow = false;
        }

        public void Refresh()
        {
            invoker = new del_Refresher(this.InvokedRefresh);

            AsyncCallback callback = new AsyncCallback(this.InvokeCallback);
            
            invoker.BeginInvoke(callback,null);
        }

        private InfoWrapper InvokedRefresh()
        {
            InfoWrapper return_infoWrapper = new InfoWrapper();

            /////// code der die infos aus dem internet liest und in den return_infoWrapper schreibt ////////////

            return return_infoWrapper;
        }

        private void InvokeCallback(IAsyncResult ar)
        {
            infoWrapper = invoker.EndInvoke(ar);
            
            /////// an dieser stelle wird die exception geworfen //////////////

            this.Lyrics.Text = infoWrapper.lyrics;
            this.Description.Text = infoWrapper.description;
            this.Cover.Source = infoWrapper.image;
        }

    }

meint dieseexception jetzt, dass sich Lyrics etc im vesitz des fenster-threads befindet und ich mit dem hintergrundthread nicht darauf zugreifen darf? wenn ja, weis vielleicht jemand einen workaround, oder hat jemand eine idee? vielleicht mache ich auch prinzipiell etwas beim benutzen der threads falsch...

vielen dank schonmal und
greetz

tom

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 13.07.07 09:47 
Hallo!

Zugriffe auf die GUI von einem anderen Thread aus musst Du über Dispatcher.Invoke tätigen. IIRC enthält die Doku dazu ein Beispiel. Kleiner Tipp: Wenn Du mit einer anonymen Methode arbeitest, sieht der Code dann fast so aus wie Deiner jetzt ;-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kouran Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Gentoo Linux x86 2.6.22, WinXP
C#, Java, Pascal, Lisp, Vim ,VS2k5(VimEmu)
BeitragVerfasst: Fr 13.07.07 10:12 
vieeeeelen dank für deine schnelle antwort, diu hast mich gerade vor der verzeiflung bewahrt ;). die doku von der du gesprochen hast finde ich allerdings über google nicht,... werde mir mal die doku in der msdn anschauen

greetz
tom
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 13.07.07 10:17 
user profile iconKouran hat folgendes geschrieben:
werde mir mal die doku in der msdn anschauen
Die meinte ich ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".