2015-06-20 4 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; 
} 

or si сть 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(); 
    } 
} 
Смежные вопросы