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
。我认为你不需要它来回答这个问题。]
答案 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中使用Wait
或Result
会导致死锁(如您所见)。有许多问题/文章在讨论它 - 即。 await vs Task.Wait - Deadlock?