我最近开始使用窗口电话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调用异步委托。
此外,我想了解为什么不允许对代表进行异步调用。
答案 0 :(得分:5)
在线程池线程上调用委托目标的能力对于委托来说是一个奇怪的功能。它属于“很好的”类别,但对于在TP线程上运行代码并不重要。它的实际实现类似于冰山,需要大量代码才能在另一个线程上构建具有任意参数的堆栈帧,管理它们的生命周期,捕获执行结果并将它们编组回调用线程。
该代码是CLR Remoting支持代码。并且在Compact Framework中开始的CLR分支中缺失并演变为Silverlight和Windows Phone。尺寸很重要的平台,为了保持小型化而削减了平台。比较大约5兆字节的Silverlight和大约50兆字节的桌面,非常壮观。
另一种方法是使用ThreadPool.QueueUserWorkItem()代替。它在您可以传递的参数中受到限制,可以通过使用lambda表达式捕获它们来轻松解决。只有你需要担心的事情是异常,它们会在工作线程上被提出并且如果你没有在那里捕获它们将终止你的应用程序。
答案 1 :(得分: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();
}
}
}