0

ここでの最初の投稿、質問から始めて申し訳ありません。

私の Windows Phone 7 アプリでは、バックグラウンド エージェントによってトリガーされているライブタイルが動作しています。しかし、httpwebrequest が 10 秒後にタイムアウトするようにコードを変更するにはどうすればよいでしょうか?

前もって感謝します。

protected override void OnInvoke(ScheduledTask task)
    {
        //TODO: Add code to perform your task in background

        var request = (HttpWebRequest)WebRequest.Create(
        new Uri("site.com"));

        request.BeginGetResponse(r =>
        {
            var httpRequest = (HttpWebRequest)r.AsyncState;
            var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);
            using (var reader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var response = reader.ReadToEnd();

                Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    string strResult = response;


                    /// If application uses both PeriodicTask and ResourceIntensiveTask
                    if (task is PeriodicTask)
                    {
                        // Execute periodic task actions here.
                        ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("TileID=2"));
                        if (TileToFind != null)
                        {

                            StandardTileData NewTileData = new StandardTileData
                            {
                                BackgroundImage = new Uri("Pin-to-start.png", UriKind.Relative),
                                Title = strResult,
                                Count = null
                            };
                            TileToFind.Update(NewTileData);
                        }
                    }
                    else
                    {
                        // Execute resource-intensive task actions here.
                    }

                    NotifyComplete();
                }));
            }
        }, request);
    }
4

2 に答える 2

3

これは、アプリの1つで使用するコードからのコピー/貼り付けです。60 秒後に接続を中止します。

    private static void DoWebRequest(string uri)
    {
        string id = "my_request";

        Timer t = null;
        int timeout = 60; // in seconds

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Accept = "*/*";
            request.AllowAutoRedirect = true;

            // disable caching.
            request.Headers["Cache-Control"] = "no-cache";
            request.Headers["Pragma"] = "no-cache";

            t = new Timer(
                state =>
                {
                    if (string.Compare(state.ToString(), id, StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        logger.Write("Timeout reached for connection [{0}], aborting download.", id);

                        request.Abort();
                        t.Dispose();
                    }
                },
                id,
                timeout * 1000,
                0);

            request.BeginGetResponse(
                r =>
                {
                    try
                    {
                        if (t != null)
                        {
                            t.Dispose();
                        }

                        // your code for processing the results

                    }
                    catch
                    {
                        // error handling.
                    }
                },
                request);
        }
        catch
        {
        }
    }
于 2011-11-02T18:58:09.240 に答える
2

しかし、httpwebrequest が 10 秒後にタイムアウトするようにコードを変更するにはどうすればよいでしょうか?

つまり、タイムアウトに関係なく呼び出されるということNotifyComplete() ですか?-) 問題は、15 秒後にタスクが終了し、ユーザーが (アプリ内で) 再起動するまで無効になることです。

Silverlight には TPL を使用し、タスクを使用してタイムアウトを設定する機能を利用することをお勧めします。

何かのようなもの:

protected override void OnInvoke(ScheduledTask task)
{
    var fetchTask = FetchData(TimeSpan.FromSeconds(10));
    fetchTask.ContinueWith(x =>
    {
        Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            string strResult = x.Result; // mind you, x.Result will be "null" when a timeout occours.

            ...

            NotifyComplete();
        }));
    });
}

private Task<string> FetchData(TimeSpan timeout)
{ 
    var tcs = new TaskCompletionSource<string>();
    var request = (HttpWebRequest)WebRequest.Create(new Uri("site.com"));

    Timer timer = null;
    timer = new Timer(sender =>
    {
        tcs.TrySetResult(null);
        timer.Dispose();
    }, null, (int)timeout.TotalMilliseconds, Timeout.Infinite);

    request.BeginGetResponse(r =>
    {
        var httpRequest = (HttpWebRequest)r.AsyncState;
        var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);
        using (var reader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var response = reader.ReadToEnd();
            tcs.TrySetResult(response);
        }
    });

    return tcs.Task;
}
于 2011-11-03T09:59:28.373 に答える