Task.Result 始终为 null

2024-04-19

我正在编写一些代码来通过 Task.Factory.FromAsync (在 WP7 应用程序中)执行 HttpRequest 。

任务的 Result 属性始终为 null,但我知道请求本身是正确的,因为如果我将其粘贴到浏览器或 Fiddler 中,它就会起作用。这是我的代码:

        string _url = string.Format("http://requestapi.net/{0}/{1}/{2}", 
            "objects","partitionKey","pkey1");
        var request = (HttpWebRequest)WebRequest.Create(_url);
        request.Method = "GET";

        Task<WebResponse> task1 = Task<WebResponse>.Factory.FromAsync(
            (callback, o) => ((HttpWebRequest)o).BeginGetResponse(callback, o)
            , result => ((HttpWebRequest)result.AsyncState).EndGetResponse(result)
            , request);

        task1.Start();
        WebResponse webResponse = task1.Result;
        string responseString;

        using (var response = (HttpWebResponse)webResponse)
        {
            using (Stream streamResponse = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(streamResponse);
                responseString = reader.ReadToEnd();
                reader.Close();
            }
        }

更新:在 WP7 上,TPL 只能通过 Nuget 获得。我在这里下载的:http://nuget.org/packages/System.Threading.Tasks http://nuget.org/packages/System.Threading.Tasks

更新: 这有效。迈克是对的——任务还没有完成。我不确定为什么 task1.Result 没有自动等待(它应该隐式调用 task1.wait()),但这是工作代码。如果您发现其他问题,请告诉我!此代码从 task1.Start() 原来所在的位置开始 - 现在已删除。

            //task1.Start();
            string responseString;
            task1.ContinueWith((antecedent) =>
            {

                WebResponse webResponse = task1.Result;

                using (var response = (HttpWebResponse)webResponse)
                {
                    using (Stream streamResponse = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(streamResponse);
                        responseString = reader.ReadToEnd();
                        reader.Close();
                    }
                }
            });

您基本上是在创建一个任务,但在检查结果之前并不等待它完成。从评论来看,WP7 运行时和框架的工作方式似乎与完整的 CLR 有点不同,当您尝试获取结果时,它会阻塞。 Silverlight 运行时非常抗阻塞。

你会想要使用await关键字(可在较新的运行时使用或使用异步定位包 http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack如果你有 VS2012)或ContinueWith异步启动任务的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Task.Result 始终为 null 的相关文章

随机推荐