【问题标题】:Return multiple values from a C# asynchronous method从 C# 异步方法返回多个值
【发布时间】:2018-09-20 04:40:29
【问题描述】:

我分别使用过异步方法和返回多个值的方法。在这种特定情况下,“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);
        }

【问题讨论】:

    标签: asynchronous async-await entity-framework-core return-value c#-7.0


    【解决方案1】:

    在玩过代码之后,我能够弄清楚。这是解决方案。

            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);
            }
    

    【讨论】:

    • C# 7.0 中的这段代码将返回编译器错误:“预定义类型 System.ValueTuple 未定义或导入”参见intellitect.com/fix-system-valuetuple-errorstackoverflow.com/questions/38382971/… 的答案
    • 感谢您解决这个问题。您是否有机会从 Nuget Manager 安装 System.ValueTuple 以解决此问题?如果这对您没有帮助,请告诉我,我会为您寻找其他解决方案。干杯!
    • 很高兴听到这个消息。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多