2015-06-20 148 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(); 
    } 
}