如何调用返回任务的方法<t>从ASP.Net MVC4控制器方法?</t>

时间:2013-12-26 04:15:22

标签: c# asp.net-mvc asp.net-mvc-4 task-parallel-library instagram

TL; DR:我想知道从 ASP.Net MVC4 Task<T>的方法中获取返回值> Controller的ActionResult方法。代码片段如下。

问题详情:
我在 github 上使用Instasharp Library

以下是返回Search的{​​{1}}方法。这在Instasharp Library中定义。

Task<UserResponse>

这是同一个库项目的源代码中的单元测试,它有效。如果我在/// <summary> /// Search for a user by name. /// <para> /// <c>Requires Authentication: False</c> /// </para> /// </summary> /// <param name="searchTem">A query string.</param> /// <param name="count">Number of users to return.</param> /// <returns>UsersResponse</returns> public Task<UsersResponse> Search(string searchTerm, int? count = null) { var request = base.Request("search"); request.AddParameter("q", searchTerm); request.AddParameter("count", count); return base.Client.ExecuteAsync<UsersResponse>(request); } 行放置一个断点并检查Assert,它会包含一个result的实例,其中包含来自Instagram API的数据。

List<UserResponse>

在我的ASP.Net MVC4应用程序的 [TestMethod, TestCategory("Users.Search")] public async Task Search() { var result = await users.Search("shiva"); Assert.IsTrue(result.Data.Count > 0); } 中,HomeController方法将查询instagram API并返回强类型Index(包含在List<Instasharp.Models.User>Data对象的属性)到相应的View,代码如下。 (注意:这是根据Github页面上的文档而定的。)。

UserResponse

问题:
我的代码已挂起(即 public class HomeController : Controller { public ActionResult Index() { var userList = new List<InstaSharp.Models.User>(); var mediaList = new List<InstaSharp.Models.Media>(); var followingList = new List<InstaSharp.Models.User>(); try { var config = new InstaSharp.InstagramConfig( clientId:"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", clientSecret:"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); InstaSharp.Endpoints.Users users = new InstaSharp.Endpoints.Users(config); var result = users.Search("shiva"); userList = result.Result.Data; } catch (Exception ex) { ViewBag.Message = ex.Message + "\n\n" + ex.StackTrace.ToString(); } return View(userList); } } 只是在等待。)。使用Instagram API进行身份验证没有问题。这条线

localhost:portnumber

显示结果为var result = users.Search("shiva");。我不确定如何调用它并从Task方法的返回值中获取Data

我尝试过的事情:
我已尝试在users.Search("shiva")电话前添加await。然后编译器要我让users.Search("shiva")ActionResult Index()并围绕它async。当我也这样做时,代码挂起了。 我也尝试过查看MSDN at this tutorial,但这也无济于事。 我已经花了很多时间在这上面,我希望有人可以帮助我。

[注意:这不是生产代码。我只是想让Instasharp库在ASP.Net MVC4控制器中工作并在View中显示数据。所以请不要注意编码实践等。此外,我已经伪造了问题的Task<..>ClientId。我认为你不需要它来回答这个问题。]

1 个答案:

答案 0 :(得分:3)

要正确调用MVC4 +中的async方法,您应该通过返回Task<ActionResult>并使用await等待完成async方法来使您的操作异步。 / p>

在以下MSDN文章Using Asynchronous Methods in ASP.NET MVC 4(以及许多其他文章)中详细介绍。来自以下文章的样本:

public async Task<ActionResult> GizmosAsync()
{
    var gizmoService = new GizmoService();
    var result = await gizmoService.GetGizmosAsync();
    return View("Gizmos", result);
}

请注意,在ASP.Net中使用WaitResult会导致死锁(如您所见)。有许多问题/文章在讨论它 - 即。 await vs Task.Wait - Deadlock?