具有自定义任务的 C# 任务重写函数
C# Task rewrite function with custom task
我有一个这样声明的函数:
public Task<PossibleUser> FindByNameAsync(string userName)
{
Task<PossibleUser> task = context.TabelaStudenti.Where(
apu => apu.NrMatricol == userName)
.FirstOrDefaultAsync();
return task;
}
问题是我现在想return那个函数的其他东西,例如,我试过:
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;
}
但它似乎不起作用,我没有收到该功能的响应。
我如何修改第一个函数以便 return 我自己的自定义任务?
我必须说明这个函数已经像这样被调用了:
PossibleUser user = await userManager.FindAsync(context.UserName, context.Password);
它是 ASP.NET Web API Owin 身份验证的一部分,其中 UserManager 是
UserManagerFactory = () => new UserManager<PossibleUser>(new StudentStore()) { PasswordHasher = new MyPasswordHasher() };
您只是忘记启动新创建的任务:
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;
}
或者由于 C# 编译器足够智能,您可以直接 return 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;
}
您可以使用 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();
});
}
永远不要使用任务构造函数。只需使用 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();
}
}
我有一个这样声明的函数:
public Task<PossibleUser> FindByNameAsync(string userName)
{
Task<PossibleUser> task = context.TabelaStudenti.Where(
apu => apu.NrMatricol == userName)
.FirstOrDefaultAsync();
return task;
}
问题是我现在想return那个函数的其他东西,例如,我试过:
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;
}
但它似乎不起作用,我没有收到该功能的响应。 我如何修改第一个函数以便 return 我自己的自定义任务?
我必须说明这个函数已经像这样被调用了:
PossibleUser user = await userManager.FindAsync(context.UserName, context.Password);
它是 ASP.NET Web API Owin 身份验证的一部分,其中 UserManager 是
UserManagerFactory = () => new UserManager<PossibleUser>(new StudentStore()) { PasswordHasher = new MyPasswordHasher() };
您只是忘记启动新创建的任务:
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;
}
或者由于 C# 编译器足够智能,您可以直接 return 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;
}
您可以使用 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();
});
}
永远不要使用任务构造函数。只需使用 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();
}
}