10

API を呼び出して、それ自体を更新する必要があるデータを取得するバックグラウンド タスクを持つ Win RT アプリがあります。ただし、問題が発生しました。API を呼び出す要求は、バックグラウンド タスクの外で実行すると完全に機能します。バックグラウンド タスク内では失敗し、問題を指摘するのに役立つ可能性のある例外も非表示になります。

この問題をデバッガーで追跡して問題点を追跡し、実行が GetAsync で停止することを確認しました。(私が渡している URL は有効であり、URL は 1 秒以内に応答します)

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 に答える