繁体   English   中英

.net紧凑框架不支持异步调用委托

[英].net compact framework does not support invoking delegates asynchronously

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

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调用异步委托。

我也想理解为什么不允许异步调用委托。

可以在线程池线程上调用委托目标的功能对于委托来说有点奇怪。 它属于“ nice to have”类别,但对于在TP线程上运行代码不是必需的。 它的实际实现类似于一个冰山,需要大量代码才能在另一个线程上构建带有任意参数的堆栈框架,管理其生命周期,捕获执行结果并将其编组回调用线程。

该代码是CLR Remoting支持代码。 在Compact Framework中启动并发展为Silverlight和Windows Phone的CLR分支中缺少此功能。 在尺寸重要的平台上,努力减小尺寸。 比较Silverlight的约5兆字节和台式机的约50兆字节,这是一个壮举。

替代方法是使用ThreadPool.QueueUserWorkItem()。 它受到您可以传递的参数的限制,可以通过使用lambda表达式捕获它们来轻松解决。 唯一需要担心的事情就是例外,它们会在工作线程中引发,并且如果您不在那里发现它们,则会终止您的应用程序。

您可以改用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();
     }
 }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM