10

我有一个 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'
{
    ...
}
4

2 回答 2

11

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

于 2012-10-26T04:24:37.870 回答
-1

以下是我的做法,它对我有用

        // Create a New HttpClient object.
        var handler = new HttpClientHandler {AllowAutoRedirect = false};
        var client = new HttpClient(handler);
        client.DefaultRequestHeaders.Add("user-agent",
                                         "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

        var response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
于 2012-10-26T01:39:01.457 回答