2012-10-20 10 views
7

Desidero avvertire la mia pagina che i dati trasmessi sono stati completati. Creo l'oggetto, aggiungo il gestore di eventi e chiamo il nuovo Thread per i dati trasmessi asincroni al server. Quando i dati vengono trasmessi, e vengono ricevuti dal server, rispondo al mio evento di callback, ma restituisco l'eccezione 'accesso incrociato non valido'. Perché non eseguire il gestore di eventi?WP 7 multithreading, accesso incrociato non valido

// My page (PhoneApplicationPage) 
public partial class PageStart 
{ 
    private void btn_Send_Click(object sender, RoutedEventArgs e) 
    { 
      TransmitHolder holder = new TransmitHolder(); 
      holder.onCompleted += new TransmitHolder.CompleteHandler(onCompleted); 
      // transmit async 
      new Thread(delegate() { Transmitter(holder).Start(); }).Start(); 
    } 

    private void onCompleted(object sender, byte[] answer) 
    { 
      //some code 
    } 
} 

public class TransmitHolder 
{ 
    public delegate void CompleteHandler(object sender, byte[] answer); 
    public event CompleteHandler onCompleted; 

    public void Complete(byte[] answer) 
    { 
     if (onCompleted != null) 
     { 
      onCompleted(null, answer); // here throw exception `invalid cross-thread access` 
     } 
    } 
} 

public class Transmitter 
{ 
    private TransmitHolder holder; 

    public Transmitter(TransmitHolder holder) 
    { 
     this.holder = holder; 
    } 

    // send data from server 
    public void Start() 
    { 
     // send data using soket 
     NetworkManager nm = new NetworkManager(); 
     // method Send execute Connect, Send and Recive data from server 
     byte[] answer = nm.Send(Encoding.UTF8.GetBytes("hello_word")); 
     holder.Complette(answer); // notify, send data completed 
    } 
} 
+2

Si prega di inviare il codice all'interno del metodo 'OnCompleted'. – Tudor

risposta

9

Sulla piattaforma Windows Phone 7, tutta la logica dell'interfaccia utente deve essere eseguita sul thread dell'interfaccia utente. Se si tenta di modificare la struttura visiva, o di impostare/ottenere una proprietà di DependencyObject (tutti gli elementi dell'interfaccia utente sono DependencyObject (s)) su un thread diverso dal thread dell'interfaccia utente dedicata, si otterrà un'eccezione di thread incrociato non valida.

Per eseguire la logica dell'interfaccia utente sul thread corretto, utilizzare il dispatcher adeguato.

Deployment.Current.Dispatcher.BeginInvoke(() => { <Put your UI logic here> }); 
Problemi correlati