Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用异步任务获取数据并在视图中显示?_C#_Asp.net Mvc_C# 4.0_Async Await_Asp.net Web Api2 - Fatal编程技术网

C# 如何使用异步任务获取数据并在视图中显示?

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()) {

我有一个web API,我想在控制器中获取一些数据并在视图中显示

这是我的主要课程:

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();
}