【问题标题】:Using function with return type Task<T>使用返回类型为 Task<T> 的函数
【发布时间】:2016-06-20 13:43:34
【问题描述】:

我有一个执行以下操作的函数:

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 中的对象的所有属性?

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

标记你的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

【讨论】:

  • 谢谢。我对我的代码做了一些更改,但这正是我所需要的
【解决方案2】:

您应该等待调用 UserClass.GetUserInfo();

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

方法签名应该是:

public async static Task<CurrentUserData> GetUserInfo()

【讨论】:

    【解决方案3】:

    更正您的代码

    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
    }
    

    【讨论】:

    • @cFrozenDeath 为什么要downwote?
    【解决方案4】:

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

    public static async Task<CurrentUserData> GetUserInfo()
    

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

    var user = await UserClass.GetUserInfo();
    

    它本身将在 async 方法中:

    public static async Task<CurrentUserData> GetUserInfo()
    

    以此类推,一直到栈顶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多