【发布时间】:2012-09-11 03:16:19
【问题描述】:
我正在使用 HttpClient 将数据发布到 .NET 4.0 项目中的远程服务。我不关心这个操作阻塞,所以我想我可以跳过 ContinueWith 或 async/await 并使用 Result。
在调试时,我遇到了远程服务器没有响应的问题。当我单步执行代码时,我的代码似乎刚刚在第三行停止运行......当前堆栈指针行停止以黄色突出显示,并且没有前进到下一行。它就这样消失了。我花了一段时间才意识到我应该等待请求超时。
var client = new HttpClient();
var task = client.PostAsync("http://someservice/", someContent);
var response = task.Result;
我的理解是,在 Task 上调用 Result 会导致代码同步执行,表现得更像这样(我知道 HttpClient 中没有 Post 方法):
var client = new HttpClient();
var response = client.Post("http://someservice/", someContent);
我不确定这是一件坏事,我只是想弄清楚它。由于 HttpClient 正在返回任务而不是直接返回结果这一事实,我的应用程序是否真的会自动利用异步,即使我认为我正在避免它?
【问题讨论】:
-
文档说:“此属性的 get 访问器确保异步操作在返回之前完成。”所以你的假设是正确的。但是,也许你会遇到因为操作失败而导致 Task 抛出异常的情况。
-
我猜是堆栈指针消失了。我没有意识到如果我等待的时间足够长,阻塞的 Result 调用就会异常。看起来好像代码在方法执行到一半时就停止了。也许这应该是一个 VS Connect 类型的问题,要求提供一些 UI 提示,即第三行有一个异步操作挂起。我认为调试器甚至将我带回了调用类。
-
有完整源代码的最终解决方案吗?
标签: c# asynchronous task