簡體   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