0

我对 wp7 开发相当陌生,目前正在开发一个应用程序,它有一个后台代理来根据它从网络调用到 api 获得的响应来更新值。

我的问题是对网络调用的响应是异步调用,我无法访问从后台代理返回的结果。

有什么方法可以让我从后台代理中进行同步调用,以便让我在同一个代理中处理结果?

我曾尝试在共享库中的一个类中处理 Web 调用,但异步调用仅在代理的 onInvoke 方法完成后进行,因此没有用。任何想法都会很棒。

4

2 回答 2

1

您只需要在异步调用的 Completed 处理程序中调用 NotifyComplete() 方法,而不是之前。在 Invoke 结束时删除调用。

于 2013-04-22T12:56:38.133 回答
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();
}

请记住,您应该检查连接是否可用并处理可能的异常,如果您的后台代理连续两次被杀死(由于内存消耗或持续时间),它将被操作系统禁用。

于 2013-04-22T20:21:28.413 回答