我是wp7开发的新手,目前开发的应用程序有一个后台代理,可以根据从Web调用到api的响应来更新值。
我的问题是对Web调用的响应是异步调用,我无法访问后台代理中返回的结果。
有什么方法可以在后台代理中进行同步调用,以便让我在同一个代理中处理结果?
我尝试在共享库中的类中处理Web调用,但异步调用仅在代理的onInvoke方法完成后才进行,因此没有用。任何想法都会很棒。
答案 0 :(得分:1)
您只需要在异步调用的Completed处理程序中调用NotifyComplete()方法,而不是之前。在Invoke结束时删除调用。
答案 1 :(得分:0)
您可以像这样使用AutoResetEvent:
protected override void OnInvoke(ScheduledTask task)
{
AutoResetEvent are = new AutoResetEvent(false);
//your asynchronous call, for example:
WebClient wc = new WebClient();
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.OpenReadAsync(searchUri, channel);
// lock the thread until web call is completed
are.WaitOne();
//finally call the NotifyComplete method to end the background agent
NotifyComplete();
}
并且您的回调方法应如下所示:
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
//do stuff with the web call response
//signals locked thread that can now proceed
are.Set();
}
请记住,您应检查连接是否可用并处理可能的异常,如果后台代理连续两次被杀(由于内存消耗或持续时间),操作系统将禁用它。