Return 来自 C# 异步方法的多个值
Return multiple values from a C# asynchronous method
我分别使用过异步方法和 return 多个值的方法。在这种特定情况下,遵循 "GetTaskTypeAndId()" 方法应该是异步的,并且应该同时 return 多个值。我应该如何使此方法异步?
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);
}
玩过代码后,我终于明白了。这是解决方案。
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);
}
我分别使用过异步方法和 return 多个值的方法。在这种特定情况下,遵循 "GetTaskTypeAndId()" 方法应该是异步的,并且应该同时 return 多个值。我应该如何使此方法异步?
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);
}
玩过代码后,我终于明白了。这是解决方案。
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);
}