繁体   English   中英

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

[英]How do I call a method that returns a Task<T> From an ASP.Net MVC4 Controller Method?

TL; DR:我想知道如何从从ASP.Net MVC4控制器的ActionResult方法调用时返回Task<T>的方法中获取返回值。 下面的代码段。

问题详细信息:
我在github上使用Instasharp库

这是返回Task<UserResponse>Search方法。 这在Instasharp库中定义。

/// <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 ,则该断点包含List<UserResponse>的实例,该实例具有来自Instagram API的数据。

    [TestMethod, TestCategory("Users.Search")]
    public async Task Search()
    {
        var result = await users.Search("shiva");
        Assert.IsTrue(result.Data.Count > 0);
    }

在我的ASP.Net MVC4应用程序的HomeController ,在Index方法中将查询instagram API,并将强类型List<Instasharp.Models.User> (包含在UserResponse对象的Data属性中)返回到相应的View,代码如下。 (注意:这是基于Github页面上的文档,应该可以使用。)

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

问题:
我的代码正在挂起(即localhost:portnumber正在等待。)。 使用Instagram API进行身份验证没有问题。 线

var result = users.Search("shiva");

显示结果是一个Task 我不确定如何调用它并从users.Search("shiva")方法的返回值中获取Data

我尝试过的
我试着加入await在前面users.Search("shiva")调用。 然后,编译器要求我使ActionResult Index()async并在其周围包装Task<..> 当我也这样做时,代码就挂了。 我也尝试在本教程中查看MSDN,但这也无济于事。 我已经花了很多时间在此上,并希望有人能帮助我。

[注意:这不是生产代码。 我只是想让Instasharp库在ASP.Net MVC4控制器中工作并在视图中显示数据。 因此,请不要着迷于编码实践等。此外,对于这个问题,我还伪造了ClientIdClientSecret 我认为您不需要它来回答这个问题。]

为了正确地调用MVC4 +中的async方法,您应该通过返回Task<ActionResult>并使用await等待async方法的完成来使操作async

以下MSDN文章在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将导致死锁(如您所观察)。 有很多讨论它的问题/文章-即等待vs Task.Wait-死锁?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM