WIndows Phone 8.1 的异步方法未在后台模式下调用

Async Method is not calling in Background mode for WIndows Phone 8.1

我为 windows phone8.1 silver light 网络服务应用程序创建了后台调度程序。当它调用异步方法时,它不会固定服务器。没有后台代理,Web 服务工作正常,但在后台调度程序中它不工作。任何人都可以指导 me.The 以下是我的代码。

  1)  WebservicePortTypeClient client = null;
  2)  client = new WebservicePortTypeClient();
  3)  client.MMAsync(objlog.Stringify(), valueacccoundid.ToString(), valuePushToken.ToString(), "version14");
  4)  client.MMCompleted +=   new EventHandler<MMCompletedEventArgs>(returnmlp);

在步骤--3 时,它在日志中抛出以下语句。

程序“[3436] BACKGROUNDTASKHOST.EXE”已退出,代码为 1 (0x1)。 程序“[2828] AgHost.exe”已退出,代码为 0 (0x0)

如有任何建议,我们将不胜感激。

您应该使用延迟来指示后台任务何时完成。否则 OS 可能会提前终止后台线程。你会这样做:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

    WebservicePortTypeClient client = null;
    client = new WebservicePortTypeClient();
    var result = await client.MMAsync(objlog.Stringify(), valueacccoundid.ToString(), valuePushToken.ToString(), "version14");

    //Do something with result.

    //Add this after your task is complete.
    deferral.Complete();
}

更多信息可以在这里找到:https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh977055.aspx(参考点 4)

对于 Windows Phone 8 个样式代理:

将方法签名设为 "protected async override..." 并为异步方法使用 await 关键字。

protected async override void  OnInvoke(ScheduledTask task)
{
    WebservicePortTypeClient client = null;
    client = new WebservicePortTypeClient();
    var result = await client.MMAsync(objlog.Stringify(), valueacccoundid.ToString(), valuePushToken.ToString(), "version14");

    //Do something with result

    NotifyComplete();
}

我使用以下代码实现了异步 Web 服务调用。

 int intResult = await TaskOfTResult_MethodAsync();
 async Task<int> TaskOfTResult_MethodAsync()
{
 1)  WebservicePortTypeClient client = null;
  2)  client = new WebservicePortTypeClient();
  3)  client.MMAsync(objlog.Stringify(), valueacccoundid.ToString(), valuePushToken.ToString(), "version14");
**await Task.Delay(TimeSpan.FromSeconds(20));**
  4)  client.MMCompleted +=   new EventHandler<MMCompletedEventArgs>(returnmlp);
}