WP 7 多线程编程,无效的跨线程访问

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
1个回答

9
在Windows Phone 7平台上,所有UI逻辑都应该在UI线程上完成。如果你试图在与专用UI线程不同的线程上更改可视化树,或者设置/获取DependencyObject(所有UI元素都是DependencyObject)的属性,则会出现“无效跨线程异常”。
为了在正确的线程上执行UI逻辑,请使用适当的调度程序。
Deployment.Current.Dispatcher.BeginInvoke(() => { <Put your UI logic here> }); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接