0

Windows Phone でユーザーのライブ タイルを定期的に更新するバックグラウンド エージェントを作成しようとしています。

現在、エージェントの私のコードは次のとおりです。

    string where = "";
    private GeoCoordinate MyCoordinate = null;
    HttpWebResponse webResponse;
    ...
    protected override void OnInvoke(ScheduledTask task)
    {
        System.Diagnostics.Debug.WriteLine("Invoked");
        findMe();

        NotifyComplete();
    }

    private void ResponseCallback(IAsyncResult asyncResult)
    {
        HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;
        webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult);

        MemoryStream tempStream = new MemoryStream();
        webResponse.GetResponseStream().CopyTo(tempStream);
    }

    private async void findMe()
    {
        Geolocator geolocator = new Geolocator();
        geolocator.DesiredAccuracy = PositionAccuracy.High;

        try
        {
            Geoposition currentPosition = await geolocator.GetGeopositionAsync(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10));

            MyCoordinate = new GeoCoordinate(currentPosition.Coordinate.Latitude, currentPosition.Coordinate.Longitude);

            // var uri = new Uri("http://www.streetdirectory.com//api/?mode=nearby&act=location&output=json&callback=foo&start=0&limit=1&country=sg&profile=template_1&x=" + MyCoordinate.Longitude + "&y=" + MyCoordinate.Latitude + "&dist=1");
            // var client = new HttpClient();

            var webRequest = (HttpWebRequest)HttpWebRequest.CreateHttp("http://www.streetdirectory.com//api/?mode=nearby&act=location&output=json&callback=foo&start=0&limit=1&country=sg&profile=template_1&x=" + MyCoordinate.Longitude + "&y=" + MyCoordinate.Latitude + "&dist=1");
            webRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), webRequest);

            System.Diagnostics.Debug.WriteLine("findMe after response");
            System.Diagnostics.Debug.WriteLine(MyCoordinate.Latitude);
            System.Diagnostics.Debug.WriteLine(MyCoordinate.Longitude);
            // var response = await client.GetStringAsync(uri);
            System.Diagnostics.Debug.WriteLine(webResponse.ToString());

            JToken token = JArray.Parse(webResponse.ToString())[0];
            // JToken token = JArray.Parse(response)[0];
            var name = token.Next.First.First;
            var address = token.Next.Last.First;
            where = name + ", " + address;
        }
        catch (Exception)
        {
            System.Diagnostics.Debug.WriteLine("findMe died");
            where = "";
        }
        System.Diagnostics.Debug.WriteLine("findMe complete");
        UpdateAppTile();
    }

    private void UpdateAppTile()
    {
        System.Diagnostics.Debug.WriteLine("UpdateAppTile");
        ShellTile appTile = ShellTile.ActiveTiles.First();
        if (appTile != null)
        {
            StandardTileData tileData = new StandardTileData
            {
                BackContent = where
            };

            appTile.Update(tileData);
        }
        System.Diagnostics.Debug.WriteLine("Update Completed: " + where);
    }

これを実行しようとすると、コードが到達webRequest.BeginGetResponseし、その後停止します。次の行、およびResponseCallback到達していません。

私のコードの古いバージョンはコメントアウトされています。これが問題だと思っていましたが、同じ問題が発生しました。

4

1 に答える 1

3

問題はNotifyComplete()、コールバックが戻る前に呼び出していることです。

呼び出すNotifyCompleteことで、すべての作業が終了し、エージェントを終了できることを OS に伝えます。明らかにこれは、webrequest コールバックを待っている場合には当てはまりません。

簡単な解決策は、この呼び出しをコールバック メソッドに移動することです。明らかに、エラー例外を処理する必要があり、エージェントが待機するよりも長くかかる要求タイムアウトも同様です。

待機可能なコードを使用するように変更すると、これが簡単になる場合があります。

于 2013-07-11T15:13:51.600 に答える