2015-06-20 147 views
1

我有一个被宣布像这样的功能:与自定义任务C#任务重写功能

public Task<PossibleUser> FindByNameAsync(string userName) 
{ 
    Task<PossibleUser> task = context.TabelaStudenti.Where(
     apu => apu.NrMatricol == userName) 
     .FirstOrDefaultAsync(); 

    return task; 
} 

的问题是,我想从那个函数现在返回别的东西,例如,我想:

public Task<PossibleUser> FindByNameAsync(string userName) 
    { 
     Student studentUser = context.TabelaStudenti.Where(st => st.NrMatricol == userName).FirstOrDefault(); 
     Task<PossibleUser> someTask= new Task<PossibleUser>(() => 
     { 
      if (studentUser == null) 
      { 
       return new PossibleUser() 
       { 
        Password = studentUser.Parola, 
        UserName = studentUser.UserName 
       }; 
      } 
      else 
      { 
       //just return something else 
       return new PossibleUser(); 
      } 
     }); 
    return someTask; 
    } 

但它似乎没有工作,我没有得到该功能的回应。 如何修改第一个函数以返回我自己的自定义任务?

我必须指定,这个功能已经被称为是这样的:

PossibleUser user = await userManager.FindAsync(context.UserName, context.Password); 

,这是的ASP.NET Web API Owin认证,其中的UserManager是

UserManagerFactory =() => new UserManager<PossibleUser>(new StudentStore()) { PasswordHasher = new MyPasswordHasher() }; 

回答

0

你的一部分只是忘了开始你新创建的任务:

public Task<PossibleUser> FindByNameAsync(string userName) 
{ 
    Student studentUser = context.TabelaStudenti.Where(st => st.NrMatricol == userName).FirstOrDefault(); 
    Task<PossibleUser> someTask= new Task<PossibleUser>(() => 
    { 
     if (studentUser == null) 
     { 
      return new PossibleUser() 
      { 
       Password = studentUser.Parola, 
       UserName = studentUser.UserName 
      }; 
     } 
     else 
     { 
      //just return something else 
      return new PossibleUser(); 
     } 
    }); 

    // start your task 
    someTask.Start(); 
    return someTask; 
} 

或si NCE C#编译器足够聪明你可以直接从代码返回PossibleUser

public async Task<PossibleUser> FindByNameAsync(string userName) 
{ 
    Task<PossibleUser> task = context.TabelaStudenti.Where(apu => apu.NrMatricol == userName) 
    .FirstOrDefaultAsync(); 
    // get result from async method 
    var studentUser = await task; 

    if (studentUser == null) 
    { 
     // Direct return without creating Task 
     return new PossibleUser() 
     { 
      Password = studentUser.Parola, 
      UserName = studentUser.UserName 
     }; 
    } 
    else 
    { 
     //just return something else 
     return new PossibleUser(); 
    } 
    return someTask; 
} 
0

您可以使用ContinueWith是这样的:

public Task<PossibleUser> FindByNameAsync(string userName) 
{ 
    return context.TabelaStudenti 
     .FirstOrDefaultAsync(st => st.NrMatricol == userName) 
     .ContinueWith(task => 
     { 
      var studentUser = task.Result; 
      if (studentUser != null) 
      { 
       return new PossibleUser 
       { 
        Password = studentUser.Parola, 
        UserName = studentUser.UserName 
       }; 
      } 
      //just return something else 
      return new PossibleUser(); 
     }); 
} 
2

你不应该使用任务建构。只需使用async/await

public async Task<PossibleUser> FindByNameAsync(string userName) 
{ 
    Student studentUser = await context.TabelaStudenti.FirstOrDefaultAsync(st => st.NrMatricol == userName); 
    if (studentUser != null) 
    { 
    return new PossibleUser() 
    { 
     Password = studentUser.Parola, 
     UserName = studentUser.UserName 
    }; 
    } 
    else 
    { 
    //just return something else 
    return new PossibleUser(); 
    } 
}