C# 异步方法不';不归

C# 异步方法不';不归,c#,.net,asp.net-mvc,async-await,C#,.net,Asp.net Mvc,Async Await,我有以下使用Scanner类的操作方法,该类使用一些Web服务来获取一些数据。当我在GetSuggestions方法中使用断点时,我可以看到结果。但是,这些数据永远不会返回到我的操作方法。相反,当我在Index()内检查model的值时 Id = 1, Status = System.Threading.Tasks.TaskStatus.WaitingForActivation, Method = "{null}", Result = "{Not yet computed}" 我检查了这个问题

我有以下使用
Scanner
类的操作方法,该类使用一些Web服务来获取一些数据。当我在
GetSuggestions
方法中使用断点时,我可以看到结果。但是,这些数据永远不会返回到我的操作方法。相反,当我在
Index()
内检查
model
的值时

Id = 1, Status = System.Threading.Tasks.TaskStatus.WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
我检查了这个问题,但对我并没有帮助

控制器动作方法:

[HttpGet]
public ActionResult Index()
{
    var plane = new Scanner();
    var model = plane.GetSuggestions("ISTANBUL");

    return View(model);
}
public async Task<List<PlaceDto>> GetSuggestions(string key)
{
    string url = String.Format("URL GOES HERE", key, API_KEY);

    string data = await RequestProvider.Get(url);

    return JObject.Parse(data).SelectToken("Places").ToObject<List<PlaceDto>>();
}
public static async Task<string> Get(string url)
{
    using (var client = new HttpClient())
    {
        return await client.GetStringAsync(url);
    }
}
GetSuggestions方法:

[HttpGet]
public ActionResult Index()
{
    var plane = new Scanner();
    var model = plane.GetSuggestions("ISTANBUL");

    return View(model);
}
public async Task<List<PlaceDto>> GetSuggestions(string key)
{
    string url = String.Format("URL GOES HERE", key, API_KEY);

    string data = await RequestProvider.Get(url);

    return JObject.Parse(data).SelectToken("Places").ToObject<List<PlaceDto>>();
}
public static async Task<string> Get(string url)
{
    using (var client = new HttpClient())
    {
        return await client.GetStringAsync(url);
    }
}

编辑2

我从
await client.GetStringAsync(url)中删除了await关键字和代码工作。但是,我认为这将同步运行,而不是异步运行。下面是更新的Get方法

public static async Task<string> Get(string url)
{
    using (var client = new HttpClient())
    {
        return client.GetStringAsync(url).Result;
    }  
}
公共静态异步任务获取(字符串url)
{
使用(var client=new HttpClient())
{
返回client.GetStringAsync(url).Result;
}  
}

我想你需要等待
飞机的呼叫。GetSuggestions(“伊斯坦布尔”)

[HttpGet]
公共异步任务索引()
{
var plane=新扫描仪();
var模型=等待飞机。GetSuggestions(“伊斯坦布尔”);
返回视图(模型);
}
当您调试代码时,很可能会像预期的那样进行wokring,因为您正在逐步完成代码。然而,一旦让代码自然运行,因为调用
plane.GetSuggestions(“伊斯坦布尔”)没有等待,因此继续调用
返回视图(模型)
平面之前。GetSuggestions(“伊斯坦布尔”)有机会完成


我想这就是你没有得到预期结果的原因。

你的问题有两部分

首先是僵局。您需要用
Wait
替换任何
Task.Wait
Task.Result
调用。我将更全面地解释这个死锁场景


第二个是例外。您看到此异常是因为您在ASP.NET 4.0上使用了不受支持的
async
/
wait
。您需要确保您的目标是.NET 4.5,并且。

返回类型的
GetSuggestions
Task
,您必须调用
.Result
以获取所需的
列表。内部异常堆栈跟踪是什么?@MarcelN。内部异常为空。@emrenevayeshirazi:除了Jason的答案之外,您还需要将操作签名更改为
public async Task Index()
。不确定你是否已经这么做了。@MarcelN。谢谢,但我已经试过了。见我的第1页。二,。编辑。我试过了,但当我这么做时,我得到的对象引用没有设置为实例。。。返回时出现异常等待client.GetStringAsync(url);我编辑了我的问题,有例外的细节。我试着到处等待,但没有成功。我检查了我的所有项目属性,它们都设置为.NET4.5。然而,在我的一个项目中,我有这一行。这可能是问题吗?不,这很正常。您是否绝对确定
httpRuntime
元素具有正确的
targetFramework
?我有,但我也添加了targetFramework=“4.5”。当我到达return时,wait client.GetStringAsync(url);调试时,什么也没发生,我在第页看到System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult],请更新所有NuGet软件包。您正在运行一个非常旧版本的MVC。