我有一个Win RT应用程序,它有一个后台任务,负责调用API来检索需要更新的数据。但是,我遇到了一个问题。在后台任务之外运行时,调用API的请求可以完美运行。在后台任务内部,它会失败,并且还会隐藏任何可能有助于指出问题的异常。

我通过调试器跟踪了此问题以跟踪问题点,并验证了该执行在GetAsync上停止了。 (我传递的URL有效,并且该URL在不到一秒钟的时间内响应)

var client = new HttpClient("http://www.some-base-url.com/");

try
{
    response = await client.GetAsync("valid-url");

    // Never gets here
    Debug.WriteLine("Done!");
}
catch (Exception exception)
{
    // No exception is thrown, never gets here
    Debug.WriteLine("Das Exception! " + exception);
}

我读过的所有文档都说,允许后台任务拥有所需的尽可能多的网络流量(当然,这是受限制的)。所以,我不明白为什么会失败,或者不知道其他任何方法来诊断问题。我想念什么?

更新/应答

感谢史蒂文,他指出了解决问题的方法。为了确保已定义的答案在那里,下面是修复之前和之后的后台任务:


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

    Update();

    deferral.Complete();
}

public async void Update()
{
    ...
}


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

    await Update(); // added 'await'

    deferral.Complete();
}

public async Task Update() // 'void' changed to 'Task'
{
    ...
}

最佳答案

您必须先调用 IBackgroundTaskInterface.GetDeferral ,然后在完成Complete后再调用其Task方法。

关于c# - HttpClient GetAsync在Windows 8上的后台任务失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13078635/

10-12 03:42