Asynchronous 从C#异步方法返回多个值

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

我使用过异步方法和分别返回多个值的方法。在这种特定情况下,下面的“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);
        }
        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?如果这对你没有帮助,请让我知道,我会为你寻找另一个解决方案。干杯很高兴听到这个消息。:-)