2012-10-20 23 views
7

送信されたデータが完了したことを私のページに警告します。オブジェクトを作成し、イベントハンドラを追加し、非同期送信データ用の新しいスレッドをサーバに呼び出します。データが送信され、サーバーから返信すると、私のイベントはコールバックされますが、例外「無効なクロススレッドアクセス」がスローされます。 なぜイベントハンドラを実行しないのですか?WP 7マルチスレッド、無効なクロススレッドアクセス

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

「OnCompleted」メソッドの中にコードを投稿してください。 – Tudor

答えて

9

Windows Phone 7プラットフォームでは、すべてのUIロジックはUIスレッドで実行する必要があります。ビジュアルツリーを変更しようとするか、専用UIスレッドとは異なるスレッドでDependencyObject(すべてのUI要素がDependencyObjectです)のプロパティを設定または取得すると、無効なクロススレッド例外が発生します。

正しいスレッドでUIロジックを実行するには、適切なディスパッチャを使用してください。

Deployment.Current.Dispatcher.BeginInvoke(() => { <Put your UI logic here> }); 
関連する問題