C# 如何使用异步任务获取数据并在视图中显示?
我有一个web API,我想在控制器中获取一些数据并在视图中显示 这是我的主要课程:C# 如何使用异步任务获取数据并在视图中显示?,c#,asp.net-mvc,c#-4.0,async-await,asp.net-web-api2,C#,Asp.net Mvc,C# 4.0,Async Await,Asp.net Web Api2,我有一个web API,我想在控制器中获取一些数据并在视图中显示 这是我的主要课程: public class APISrv { public string result = string.Empty; public async Task<string> GetIT() { try { using (var client = new HttpClient()) {
public class APISrv
{
public string result = string.Empty;
public async Task<string> GetIT()
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:2474/");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage Res = await
client.GetAsync("api/Test/Get");
if (Res.IsSuccessStatusCode)
{
result = Res.Content.ReadAsStringAsync().Result;
}
}
}
catch (Exception err)
{
result=err.Message;
}
return result;
}
}
在这种情况下,“result”是一个公共字段,并且始终为空,似乎主线程不等待异步方法完成其工作。我可以看到我的视图,但“ViewData[“mydata”]”为空
第二点:
public ActionResult Index()
{
APISrv aPISrv = new APISrv();
ViewData["mydata"] = aPISrv.GetIT().Result;
return View();
}
在这种情况下,我的页面停留在“等待本地…”模式下,无法工作
如何从类中获取数据以及从类中获取数据的最佳方式是什么?您将阻塞调用(
.Result
)与异步/await
混合在一起,这可能导致死锁。这就是调用控制器操作时无法返回结果的原因
参考文献
要么一直异步,要么一直同步。尽量不要把它们混在一起
result = await Res.Content.ReadAsStringAsync();
还将操作更新为异步
public async Task<ActionResult> Index() {
var aPISrv = new APISrv();
ViewData["mydata"] = await aPISrv.GetIT();
return View();
}
公共异步任务索引(){
var aPISrv=新的aPISrv();
ViewData[“mydata”]=等待aPISrv.GetIT();
返回视图();
}
此外,该服务应该通过构造函数注入进行抽象和注入,但这超出了本问题的范围。谢谢您的帮助,您的代码工作得很好,但是您能用简短的plz给我写信吗?如果我不想将控制器从正常模式更改,我是说我的控制器刚刚返回,我该如何处理“行动结果”不是“任务”?
public async Task<ActionResult> Index() {
var aPISrv = new APISrv();
ViewData["mydata"] = await aPISrv.GetIT();
return View();
}