/ / Konwertowanie Task <A> na Task <B> asynchronicznie - C #, asp.net, asynchronous, task

Konwersja zadania <A> do zadania <B> asynchronicznie - c #, asp.net, asynchroniczne, zadanie

Integruję usługę uwierzytelniania wewnętrznego z MembershipProvider. Niestandardowy dostawca:

    public override MembershipUser CreateUser(
string username,
string password,
string email,
string passwordQuestion,
string passwordAnswer,
bool isApproved,
object providerUserKey,
out MembershipCreateStatus status)
{

//var res = client.Register(username, password, email);
//status = MembershipCreateStatus.Success; // conver to Mem
return null;

Problem tkwi w kliencie. Jak zamienić jedno zadanie na drugie?

    public async Task<MembershipUser> Register(string username, string password, string email, bool isStaff=false)
{
var task = serviceFoo.Register(username, password, email, isStaff);
// TODO Task<RegisteredUser> -> Task<MembershipUser>
//var convertedTask = task.
//return new Task<MembershipUser>();
}

Chcę:

  • zrób to asynchronicznie
  • Nie chcę, aby zarejestrowany użytkownik był widoczny dla dostawcy.

Napiszę metodę rozszerzenia dla RegUser do konwersacji, ale nie mam pojęcia, jak asynchronicznie konwertować zadanie.

Odpowiedzi:

4 dla odpowiedzi № 1

nie wygląda na to, że chcesz dokonać konwersji z Task<RegisteredUser> do Task<MembershipUser>, z którego chcesz przekonwertować plik RegisteredUser do MembershipUser, zakładając, że masz wspomnianą metodę rozszerzenia konwersji, po prostu zrób to:

public async Task<MembershipUser> Register(string username, string password, string email, bool isStaff=false)
{
var user = await serviceFoo.Register(username, password, email, isStaff);// user is RegisteredUser
return user.ConvertTomembershipUser();

}

1 dla odpowiedzi nr 2

Zadanie nie ma wbudowanej funkcjonalności dla kompozycji. Na szczęście jego implementacja jest trywialna

public static async Task<TResult> flatmap<TSource, TResult>(this Task<TSource> src, Func<TSource, Task<TResult>> f) {
return await f(await src);
}

public static async Task<TResult> map<TSource, TResult>(this Task<TSource> src, Func<TSource, TResult> f) {
return f(await src);
}