Asynchronous 从C#异步方法返回多个值
我使用过异步方法和分别返回多个值的方法。在这种特定情况下,下面的“GetTaskTypeAndId()”方法应该是异步的,并且应该同时返回多个值。我应该如何使这个方法异步Asynchronous 从C#异步方法返回多个值,asynchronous,async-await,entity-framework-core,return-value,c#-7.0,Asynchronous,Async Await,Entity Framework Core,Return Value,C# 7.0,我使用过异步方法和分别返回多个值的方法。在这种特定情况下,下面的“GetTaskTypeAndId()”方法应该是异步的,并且应该同时返回多个值。我应该如何使这个方法异步 public async Task DeleteSchoolTask(int schoolNumber, int taskDetailId) { var result = GetTaskTypeAndId(taskDetailId); // This should b
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);
}
在玩了这个代码之后,我能把它弄明白。这是解决办法
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);
}
公共异步任务DeleteSchoolTask(int schoolNumber,int taskDetailId)
{
var结果=等待GetTaskTypeAndId(taskDetailId);
int taskId=result.Item1;
字符串taskType=result.Item2;
//步骤1:从服务器物理删除附件
var fileService=newfileservice(记录器,当前用户);
var relativeFilePath=$“{schoolNumber}\\{Consts.RM_SCHOOL}\\{taskDetailId}”;
fileService.DeleteAttachmentFolderFromServer(Consts.CONFIG\u SMP\u UPLOADFILE\u ROOTPATH,relativeFilePath);
//步骤2:从数据库中删除记录
等待_RoutineMaintenancePO.Value.DeleteSchoolTask(taskDetailId);
}
公共异步任务GetTaskTypeAndId(int-taskDetailId)
{
var detailRecord=wait_routinemantenancerepo.Value.GetDetailRecord(taskDetailId);
int taskId=0;
字符串taskType=“”;
开关(detailRecord.TaskType)
{
案例1:
taskId=(int)detailRecord.RoutineMaintenance;
taskType=Consts.RM\u默认值;
打破
案例2:
taskId=(int)detailRecord.RoutineMaintenanceTaskDuplicateId;
taskType=Consts.RM\u重复;
打破
案例3:
taskId=(int)detailRecord.RoutineMaintenanceTaskSchoolId;
taskType=Consts.RM_学校;
打破
违约:
打破
}
返回(任务ID、任务类型);
}
C#7.0中的这段代码将返回一个编译器错误,其大意是:“预定义类型System.ValueTuple未定义或导入”请参阅或的答案,谢谢您解决此问题。为了解决此问题,您是否有机会从Nuget Manager安装System.ValueTuple?如果这对你没有帮助,请让我知道,我会为你寻找另一个解决方案。干杯很高兴听到这个消息。:-)