我收到一条错误消息,提示我无法将 system.threading.tasks 字符串转换为字符串。
Visual Studio 给你这个错误是因为你试图将 Task<string> 分配给 string,但它找不到转换。 Task<T> 包裹了 T,您需要解开 T。从Task<T> 解包T 的正确方法是使用await。
在这种情况下,我认为分解那个巨大的return 语句更容易,然后你可以更清楚地看到你需要做什么:
public async Task<List<JobApplication>> GetApplications()
{
var canInfo = await GetCandidates();
var jobApplication = await GlobalVar.firebaseClient
.Child("JobApplication")
.OnceAsync<JobApplication>();
return jobApplication.Select(item => new JobApplication
{
CandidateID = item.Object.CandidateID,
ApplicationDate = item.Object.ApplicationDate,
ApplicationTime = item.Object.ApplicationTime,
CandidateName = canInfo.Find(a => a.CandidateId == item.Object.CandidateID).Name + " " + canInfo.Find(a => a.CandidateId == item.Object.CandidateID).LastName,
NewCanID = item.Object.CandidateID.Substring(1),
ImageURL = GetFile(item.Object.CandidateID.Substring(1) + "-One.jpg") // error
}).ToList();
}
您需要在从GetFile 返回的Task<string> 上使用await,这要求传递给Select 的lambda 为async。
public async Task<List<JobApplication>> GetApplications()
{
var canInfo = await GetCandidates();
var jobApplication = await GlobalVar.firebaseClient
.Child("JobApplication")
.OnceAsync<JobApplication>();
return jobApplication.Select(async item => new JobApplication
{
CandidateID = item.Object.CandidateID,
ApplicationDate = item.Object.ApplicationDate,
ApplicationTime = item.Object.ApplicationTime,
CandidateName = canInfo.Find(a => a.CandidateId == item.Object.CandidateID).Name + " " + canInfo.Find(a => a.CandidateId == item.Object.CandidateID).LastName,
NewCanID = item.Object.CandidateID.Substring(1),
ImageURL = await GetFile(item.Object.CandidateID.Substring(1) + "-One.jpg")
}).ToList();
// error: the code is now trying to return Task<List<Task<JobApplication>>>
}
现在,您有一个从Select 返回的任务序列。您可以(异步)等待他们一次完成一个:
public async Task<List<JobApplication>> GetApplications()
{
var canInfo = await GetCandidates();
var jobApplication = await GlobalVar.firebaseClient
.Child("JobApplication")
.OnceAsync<JobApplication>();
var result = new List<JobApplication>();
foreach (var item in jobApplication)
{
result.Add(new JobApplication
{
CandidateID = item.Object.CandidateID,
ApplicationDate = item.Object.ApplicationDate,
ApplicationTime = item.Object.ApplicationTime,
CandidateName = canInfo.Find(a => a.CandidateId == item.Object.CandidateID).Name + " " + canInfo.Find(a => a.CandidateId == item.Object.CandidateID).LastName,
NewCanID = item.Object.CandidateID.Substring(1),
ImageURL = await GetFile(item.Object.CandidateID.Substring(1) + "-One.jpg")
});
}
return result;
}
或者,您可以同时启动它们,然后等待它们全部完成:
public async Task<List<JobApplication>> GetApplications()
{
var canInfo = await GetCandidates();
var jobApplication = await GlobalVar.firebaseClient
.Child("JobApplication")
.OnceAsync<JobApplication>();
var tasks = jobApplication.Select(async item => new JobApplication
{
CandidateID = item.Object.CandidateID,
ApplicationDate = item.Object.ApplicationDate,
ApplicationTime = item.Object.ApplicationTime,
CandidateName = canInfo.Find(a => a.CandidateId == item.Object.CandidateID).Name + " " + canInfo.Find(a => a.CandidateId == item.Object.CandidateID).LastName,
NewCanID = item.Object.CandidateID.Substring(1),
ImageURL = await GetFile(item.Object.CandidateID.Substring(1) + "-One.jpg")
}).ToList();
var result = await Task.WhenAll(tasks);
return result.ToList();
}