我对 wp7 开发相当陌生,目前正在开发一个应用程序,它有一个后台代理来根据它从网络调用到 api 获得的响应来更新值。
我的问题是对网络调用的响应是异步调用,我无法访问从后台代理返回的结果。
有什么方法可以让我从后台代理中进行同步调用,以便让我在同一个代理中处理结果?
我曾尝试在共享库中的一个类中处理 Web 调用,但异步调用仅在代理的 onInvoke 方法完成后进行,因此没有用。任何想法都会很棒。
我对 wp7 开发相当陌生,目前正在开发一个应用程序,它有一个后台代理来根据它从网络调用到 api 获得的响应来更新值。
我的问题是对网络调用的响应是异步调用,我无法访问从后台代理返回的结果。
有什么方法可以让我从后台代理中进行同步调用,以便让我在同一个代理中处理结果?
我曾尝试在共享库中的一个类中处理 Web 调用,但异步调用仅在代理的 onInvoke 方法完成后进行,因此没有用。任何想法都会很棒。
您只需要在异步调用的 Completed 处理程序中调用 NotifyComplete() 方法,而不是之前。在 Invoke 结束时删除调用。
你可以像这样使用 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();
}
请记住,您应该检查连接是否可用并处理可能的异常,如果您的后台代理连续两次被杀死(由于内存消耗或持续时间),它将被操作系统禁用。