我已经为 async / await 苦苦挣扎了一周。一些背景知识:下面的代码是 MVC4 网站项目的一部分。该网站发生了大量的 API 调用。目标是让这些 API 调用并行而不是同步发生,以提高站点响应能力。现在所有的 API 调用都互相阻塞。因此,如果一页需要 4 次调用...更长的加载时间。
我已经为所有 API 调用的同步和异步版本构建了单独的方法。我遇到的问题是等待从不响应。我认为这与这个问题有关。但是,我真的不确定如何解决它。我已经尝试过 ConfigureAwait(false),但这对我没有帮助。
这是代码:
控制器中的初始调用如下所示:
BaseData bdata = API.GetBaseData().Result;
我很想在这里使用 await,但如果没有 AsyncController,这不是一个选项,由于需要请求/响应访问,我们无法使用它。其他方法在 API 类中:
internal static async Task<BaseData> GetBaseData() {
var catTask = GetParentCategoriesAsync();
var yearTask = GetYearsAsync();
await Task.WhenAll(new Task[] { catTask, yearTask });
var bdata = new BaseData {
years = await yearTask,
cats = await catTask
};
return bdata;
}
internal static async Task<List<APICategory>> GetParentCategoriesAsync() {
try {
WebClient wc = new WebClient();
wc.Proxy = null;
string url = getAPIPath();
url += "GetFullParentCategories";
url += "?dataType=JSON";
Uri targeturi = new Uri(url);
List<APICategory> cats = new List<APICategory>();
var cat_json = await wc.DownloadStringTaskAsync(targeturi);
cats = JsonConvert.DeserializeObject<List<APICategory>>(cat_json);
return cats;
} catch (Exception) {
return new List<APICategory>();
}
}
internal static async Task<List<double>> GetYearsAsync() {
WebClient wc = new WebClient();
wc.Proxy = null;
Uri targeturi = new Uri(getAPIPath() + "getyear?dataType=JSON");
var year_json = await wc.DownloadStringTaskAsync(targeturi);
List<double> years = JsonConvert.DeserializeObject<List<double>>(year_json);
return years;
}
当调用这些方法时,我可以在 GetYearsAsync() 和 GetParentCategoriesAsync() 中放置断点。一切都会触发,直到 await wc.DownloadStringTaskAsync(targeturi) 命令。那是停止的地方。
我已将 ConfigureAwait(continueOnCapturedContext: false) 添加到所有任务中,但这并没有帮助。我假设问题是线程不在同一个上下文中。但是,我不确定。但是,我确信我做错了什么。我只是不确定是什么。要么就是这样,要么我只是在尝试做一些 .NET MVC4 无法完成的事情。任何想法将不胜感激。