我使用异步方法和分别返回多个值的方法。在这种特定情况下,以下“ GetTaskTypeAndId()”方法应异步并应同时返回多个值。我应该如何使这种方法异步?
public async Task DeleteSchoolTask(int schoolNumber, int taskDetailId)
{
var result = GetTaskTypeAndId(taskDetailId); // This should be called asynchronously
int taskId = result.Item1;
string taskType = result.Item2;
// step 1: delete attachment physically from server
var fileService = new FileService(Logger, CurrentUser);
var relativeFilePath = $"{schoolNumber}\\{Consts.RM_SCHOOL}\\{taskDetailId}";
fileService.DeleteAttachmentFolderFromServer(Consts.CONFIG_SMP_UPLOADFILE_ROOTPATH, relativeFilePath);
// step 2: delete records from database
await _routineMaintenanceRepo.Value.DeleteSchoolTask(taskDetailId);
}
public (int, string) GetTaskTypeAndId(int taskDetailId) // How should I write this line using 'async Task'?
{
var detailRecord = await _routineMaintenanceRepo.Value.GetDetailRecord(taskDetailId);
int taskId = 0;
string taskType = "";
switch (detailRecord.TaskType)
{
case 1:
taskId = (int)detailRecord.RoutineMaintenanceTaskId;
taskType = Consts.RM_DEFAULT;
break;
case 2:
taskId = (int)detailRecord.RoutineMaintenanceTaskDuplicateId;
taskType = Consts.RM_DUPLICATE;
break;
case 3:
taskId = (int)detailRecord.RoutineMaintenanceTaskSchoolId;
taskType = Consts.RM_SCHOOL;
break;
default:
break;
}
return (taskId, taskType);
}
答案 0 :(得分:4)
玩完代码后,我得以弄清楚。这是解决方案。
public async Task DeleteSchoolTask(int schoolNumber, int taskDetailId)
{
var result = await GetTaskTypeAndId(taskDetailId);
int taskId = result.Item1;
string taskType = result.Item2;
// step 1: delete attachment physically from server
var fileService = new FileService(Logger, CurrentUser);
var relativeFilePath = $"{schoolNumber}\\{Consts.RM_SCHOOL}\\{taskDetailId}";
fileService.DeleteAttachmentFolderFromServer(Consts.CONFIG_SMP_UPLOADFILE_ROOTPATH, relativeFilePath);
// step 2: delete records from database
await _routineMaintenanceRepo.Value.DeleteSchoolTask(taskDetailId);
}
public async Task<(int, string)> GetTaskTypeAndId(int taskDetailId)
{
var detailRecord = await _routineMaintenanceRepo.Value.GetDetailRecord(taskDetailId);
int taskId = 0;
string taskType = "";
switch (detailRecord.TaskType)
{
case 1:
taskId = (int)detailRecord.RoutineMaintenanceTaskId;
taskType = Consts.RM_DEFAULT;
break;
case 2:
taskId = (int)detailRecord.RoutineMaintenanceTaskDuplicateId;
taskType = Consts.RM_DUPLICATE;
break;
case 3:
taskId = (int)detailRecord.RoutineMaintenanceTaskSchoolId;
taskType = Consts.RM_SCHOOL;
break;
default:
break;
}
return (taskId, taskType);
}