2012-10-20 11 views
7

Chcę ostrzec moją stronę, że przesłane dane zostały zakończone. Tworzę obiekt, dodam obsługę zdarzeń i wywołuję nowy wątek dla asynchronicznych przesyłanych danych do serwera. Kiedy dane są przesyłane i odbierane z serwera, odpowiadam i oddzwaniam do mojego zdarzenia, ale zgłaszam wyjątek "nieważny dostęp do wątku". Dlaczego nie uruchomić mojego programu obsługi zdarzeń?Wielowątkowość WP 7, niepoprawny dostęp do wielu wątków

// 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

Proszę zaksięgować kod w metodzie 'OnCompleted'. – Tudor

Odpowiedz

9

Na platformie Windows Phone 7 należy wykonać całą logikę interfejsu użytkownika na wątku interfejsu użytkownika. Jeśli spróbujesz zmienić drzewo wizualne lub ustawisz/otrzymasz właściwość DependencyObject (wszystkie elementy UI są DependencyObject (s)) w wątku innym niż dedykowany wątek UI, otrzymasz wyjątek wątku Nieprawidłowy krzyż.

Aby wykonać logikę interfejsu użytkownika w prawym wątku, użyj odpowiedniego programu rozsyłającego.

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