【问题标题】:Async Method is not calling in Background mode for WIndows Phone 8.1异步方法不在 Windows Phone 8.1 的后台模式下调用
【发布时间】:2015-05-25 06:35:27
【问题描述】:

我为 windows phone8.1 silver light web 服务应用程序创建了后台调度程序。当它调用异步方法时,它不会锁定服务器。没有后台代理,Web 服务工作正常,但在后台调度程序中无法正常工作。谁能指导我。以下是我的代码。

  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)

任何建议将不胜感激。

【问题讨论】:

    标签: web-services silverlight background windows-phone-8.1 async-await


    【解决方案1】:

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

    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 样式的代理:

    将方法签名设为“受保护的异步覆盖...”并为异步方法使用 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();
    }
    

    【讨论】:

    • 谢谢拉杰什里。我已经实现了调度代理,我无法将上述过程与我的解决方案联系起来。我怎样才能调用运行方法。
    • @rajaramesh Run 方法是 WindowsPhone 8.1 中所有 BackgroundTasks 的隐式方法。但我猜你没有使用它。您是否使用较旧的 Windows Phone 8 样式代理? (like msdn.microsoft.com/en-us/library/windows/apps/…) 如果是的话,我建议你关注msdn.microsoft.com/en-us/library/windows/apps/xaml/… 来实现更新的后台任务模块。
    • 不,我使用的是 Windows Phone 8.1。我关注了执行代理的以下网址channel9.msdn.com/Series/…
    • 调度代理工作正常。但我无法为异步方法链接 BackgroundTasks。
    • @rajaramesh 我看到了你提供的链接。它是 Windows Phone 8 风格的后台代理(尽管您可以在 WP8.1 Silverlight 中使用它)。您是否在 OnInvoke() 方法中添加了 NotifyComplete()?
    【解决方案2】:

    我使用以下代码实现了异步 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2016-01-11
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多