2

我最近开始使用window phone 7。我创建了一个委托并尝试异步调用它。代码是这样的:

public class1
{
     public delegate void fireAlwaysDelegate();
     fireAlwaysDelegate fad;
     public class1()
     {
       initializeComponents();
       fad=new fireAlwaysDelegate(fireAlways)
     }

     fireAlways()
     {
       //some code
     }

     PhoneApplicationPage_loaded()
     {
        //some code
        fda.beginInvoke(null,null);
     }
}

但是,当我执行这段代码时,它抛出了一个异常,说 .net 紧凑框架不支持异步调用委托。根据我对 WP7 框架的理解,它几乎对所有内容都使用异步调用,所以我无法理解为什么不允许这样做。

任何解决这个问题的方法。

一旦 PhoneApplicationPage_loaded 完成并且 UI 启动,我想执行一些代码,我想从 PhoneApplicationPage_loaded 调用异步委托。

另外我想了解为什么不允许对代表进行异步调用。

4

2 回答 2

6

在线程池线程上调用委托目标的能力对于委托来说有点奇怪。它属于“很高兴拥有”类别,但不是在 TP 线程上运行代码所必需的。它的实际实现就像一座冰山,需要大量代码才能在另一个线程上构建带有任意参数的堆栈帧,管理它们的生命周期,捕获执行结果并将它们编组回调用线程。

该代码是 CLR Remoting 支持代码。并且在从 Compact Framework 开始并演变为 Silverlight 和 Windows Phone 的 CLR 分支中缺失。在尺寸很重要的平台上,为了保持体积小,它被削减了。将 Silverlight 的约 5 兆字节与桌面的约 50 兆字节进行比较,相当了不起。

另一种方法是使用 ThreadPool.QueueUserWorkItem() 代替。它受到您可以传递的参数的限制,通过使用 lambda 表达式捕获它们可以轻松解决。您唯一需要担心的是异常,它们会在工作线程上引发,如果您没有在那里捕获它们,它们将终止您的应用程序。

于 2012-10-23T10:13:15.183 回答
1

您可以改用BackgroundWorker

public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    private BackgroundWorker bw = new BackgroundWorker();

    public MainPage()
    {
        InitializeComponent();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        FireAlways();
    }

  public void FireAlways()
  {
    //some code
  }

 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
 {
     if (bw.IsBusy != true)
     {
         bw.RunWorkerAsync();
     }
 }

}
于 2012-10-23T09:07:49.473 回答