使用返回类型的函数Task <t>

时间:2016-06-20 13:43:34

标签: c# asp.net-mvc

我有一个执行以下操作的功能:

public class UserClass
   {
   public static CurrentUserData GetUserInfo()
    {
        CurrentUserData ui;
            ui = GetUserData();
        return ui;
   }
   }

我的CurrentUserData对象如下:

   public class CurrentUserData 
   {
       public bool ReadOnly{get;set;}
  }

在我的控制器中,我调用我的方法,可以看到ReadOnly属性正常:

    var user = UserClass.GetUserInfo();
    if (user.ReadOnly)
 {
      ////code to execute
    }

我不得不在我的函数中添加一个异步调用,现在它看起来像这样(为了简洁我省略了代码):

  public static Task<CurrentUserData > GetUserInfo()
    {
        Task<CurrentUserData > ui;
            ui = GetUserData();
          HttpResponseMessage response = await httpClient.SendAsync(request);
        return ui;
   }

注意我必须添加的任务。但是当我像以前一样在我的控制器中调用该方法时,我得到错误:

 Error  CS1061  'Task<CurrentUserData >' does not contain a definition for 
 'ReadOnly' and no extension method 'ReadOnly' accepting a first argument of 
 type 'Task<CurrentUserData >' could be found (are you missing a using directive or 
 an assembly reference?)

我需要更改什么,所以当任何类调用我的新Task方法时,它会看到对象的所有属性都包含在Task中?

4 个答案:

答案 0 :(得分:5)

将您要返回的GetUserInfo方法asyncawait任务标记为其他方法:

public static async Task<UserClass> GetUserInfo()
{
     Task<UserClass> ui = GetUserData();
     HttpResponseMessage response = await httpClient.SendAsync(request);
     return ui;
}

//and then
var user = await UserClass.GetUserInfo();
if (user.ReadOnly)
{
    // code to execute
}

这将使任务返回等待完成,然后您可以继续生成user对象。

请务必遵循async all the way

答案 1 :(得分:1)

更正您的代码

async关键字必须位于返回类型的前面。

 public static async Task<UserClass> GetUserInfo()
    {
         Task<UserClass> ui;
         ui = GetUserData();
         HttpResponseMessage response = await httpClient.SendAsync(request);
         return ui;
   }

然后使用

var user = await UserClass.GetUserInfo();
if (user.ReadOnly)
{
    // your code here
}

答案 2 :(得分:1)

您应该等待对UserClass.GetUserInfo();

的调用
var user = await UserClass.GetUserInfo();
if (user.ReadOnly){
      ////code to execute
}

,方法签名应为:

public async static Task<CurrentUserData> GetUserInfo()

答案 3 :(得分:0)

首先,除非await运算符的方法也是async,否则甚至不应该编译

public static async Task<CurrentUserData> GetUserInfo()

一旦出现这种情况,您只需等待任何其他async方法的方法:

var user = await UserClass.GetUserInfo();

本身采用async方法:

public static async Task<CurrentUserData> GetUserInfo()

等等一直到堆栈的顶部。