gpt4 book ai didi

c# - WebClient.DownloadDataTaskAsync 与 HttpClient.GetAsync

转载 作者:行者123 更新时间:2023-11-30 17:07:43 25 4
gpt4 key购买 nike

我仍在了解 .NET 4.5 的各种异步功能,并且遇到了一些有趣的事情。在我的 MVC Controller 中给出以下内容,我在执行 (1) 和 (2) 时得到不同的结果

public ActionResult Index() {
var stuff = SomeExpensiveFunction();
return View(stuff);
}
private byte[] SomeExpensiveFunction() {
string url = "http://some-url.../";

// (1)
var wc = new WebClient();
return wc.DownloadDataTaskAsync(url).Result;

// (2)
var hc = new HttpClient();
return hc.GetAsync(url).Result.Content.ReadAsByteArrayAsync().Result;
}

从表面上看,它们看起来是一样的 - 都是 WebClient.DownloadDataTaskAsyncHttpClient.GetAsyncasync返回 Task 的方法. WebClient版本返回 Task<byte[]>HttpClient版本返回 Task<HttpResponseMessage>我必须从中挖掘字节,但我正在调用 .Result无论哪种方式,我都希望在离开该功能之前完成。

对于 (1),我得到一个黄色屏幕 An asynchronous operation cannot be started at this time... .使用 (2),一切正常。

我可以更改整个堆栈并使用 async在 Controller 方法本身和 SomeExpensiveFunction 上,一切正常。但我想弄清楚 (1) 或 WebClient 是否存在根本性错误通常在使用 MVC 时。有什么想法吗?

编辑:我知道在这个例子中我可以使用这些调用的同步版本,因为我并没有真正异步地做任何事情——这只是一个基于更大代码库的例子。

最佳答案

您违反了 ASP.NET 的 SynchronizationContext。要使 WebClient 示例正常工作,您应该使整个 Controller 异步。试试这个:

public async Task<ActionResult> IndexAsync() {
string url = "http://some-url.../";
using (var wc = new WebClient())
return View(await wc.DownloadDataTaskAsync(url));
}

参见 http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4有关异步 Controller 的简介,以及 http://www.tugberkugurlu.com/archive/asynchronousnet-client-libraries-for-your-http-api-and-awareness-of-async-await-s-bad-effects用于解释异步/等待模式的死锁效应。

关于c# - WebClient.DownloadDataTaskAsync 与 HttpClient.GetAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com