2012-10-20 10 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

कृपया 'ऑनकंपलेटेड' विधि के अंदर कोड पोस्ट करें। – Tudor

उत्तर

9

विंडोज फोन 7 प्लेटफार्म पर, यूआई थ्रेड पर सभी यूआई तर्क किए जाने चाहिए। यदि आप विजुअल ट्री को बदलने का प्रयास करते हैं, या एक निर्भरता की संपत्ति को सेट/प्राप्त करें (सभी UI तत्व निर्भरता ऑब्जेक्ट्स हैं) एक थ्रेड पर समर्पित यूआई थ्रेड के अलग-अलग हैं, तो आपको एक अवैध क्रॉस थ्रेड अपवाद मिलेगा।

दाहिने धागे पर यूआई तर्क करने के लिए, पर्याप्त प्रेषक का उपयोग करें।

Deployment.Current.Dispatcher.BeginInvoke(() => { <Put your UI logic here> }); 
संबंधित मुद्दे