【问题标题】:Async- await function not worked properly异步等待功能无法正常工作
【发布时间】:2021-03-23 09:52:01
【问题描述】:

我已经创建了异步函数。但这需要很长时间(执行)。功能如下。

    public async Task<List<EmrData>> EmrDataTransformation(string sourceJson, EMRSchema.TemplateQT emrSchema, List<double> subjectIds)
                    {
                        List<EmrData> EmrDataList = new List<EmrData>();
                        try
                        {
                            StringBuilder stringBuilder = new StringBuilder();
                            foreach (var subjectId in subjectIds)
                            {
                               var GetIcuDischargeTransform = icuDataTransform.GetIcuDischargeTransform(sourceJson, emrSchema, subjectId);
                                    stringBuilder.Append("var:GetIcuDischargeTransform: ").Append(" ").Append(DateTime.Now).AppendLine();
       
                            emrData.IcuDischarge = await GetIcuDischargeTransform;
                            stringBuilder.Append("await:GetIcuDischargeTransform: ").Append(" ").Append(DateTime.Now).AppendLine();
                            File.WriteAllText($"D:\\out\\awaitcheck{subjectId}.txt", stringBuilder.ToString());
                            }
        
                        }
                        // return EmrDataList;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }   
          return EmrDataList;
               }

从上面的函数,调用GetIcuDischargeTransform函数。该函数如下所示。

public async Task<IcuDischarge> GetIcuDischargeTransform(string sourceJson, EMRSchema.TemplateQT emrSchema, double subjectId)
        {
            List<Dictionary<string, dynamic>> keyValuePairs = new List<Dictionary<string, dynamic>>();

            #region Icu Discharge

            var templateIcuDischarge = emrSchema.EmrData.IcuDischarge; //emrSchema.IcuDischarge;
            var morStatus = Convert.ToString(CommonFunctions.GetData(sourceJson, templateIcuDischarge?.IcuDischargeIcuDischarge, templateIcuDischarge?.Mortality30DStatus, ref keyValuePairs, subjectId));
            IcuDischarge icuDischarge = new IcuDischarge
            {
                CauseofReadmission = CommonFunctions.GetData(sourceJson, null, templateIcuDischarge?.CauseofReadmission, ref keyValuePairs, subjectId),
                DateofReadmission = CommonFunctions.GetData(sourceJson, templateIcuDischarge?.CauseofReadmission, templateIcuDischarge?.DateofReadmission, ref keyValuePairs, subjectId),
                DischargeDisposition = CommonFunctions.GetData(sourceJson, templateIcuDischarge?.DateofReadmission, templateIcuDischarge?.DischargeDisposition, ref keyValuePairs, subjectId),
                DischargingUnit = CommonFunctions.GetData(sourceJson, templateIcuDischarge?.DischargeDisposition, templateIcuDischarge?.DischargingUnit, ref keyValuePairs, subjectId),
                IcuDischargeIcuDischarge = CommonFunctions.GetData(sourceJson, templateIcuDischarge?.DischargingUnit, templateIcuDischarge?.IcuDischargeIcuDischarge, ref keyValuePairs, subjectId),
                Mortality30DStatus = EnumProvider.TryParse<Mortality30DStatus>(EnumProvider.FormatStringForEnumCompare(morStatus), Mortality30DStatus.None),
                ReadmissionWithin30Days = CommonFunctions.GetData(sourceJson, templateIcuDischarge?.Mortality30DStatus, templateIcuDischarge?.ReadmissionWithin30Days, ref keyValuePairs, subjectId)
            };

            #endregion Icu Discharge

            return icuDischarge;
        }

下面给出常用函数类,

public static dynamic GetData(string sourceJson, dynamic oldTemplate, dynamic newTemplate, ref List<Dictionary<string, dynamic>> keyValuePairs,
           double subjectId, ArrayResult arrayResult = ArrayResult.Single)
        {
            if (keyValuePairs != null && oldTemplate != null && newTemplate != null && (oldTemplate.File == newTemplate?.File && oldTemplate.Sheet == newTemplate?.Sheet))
            
            {
                return GetSingleValuesFromList(keyValuePairs, newTemplate.Column, arrayResult);
            }
            else
            {
                //keyValuePairs = GetValuesFrom(sourceJson, newTemplate.File, newTemplate.Sheet, newTemplate.Column, subjectId);
                keyValuePairs = GetValuesFrom(sourceJson, newTemplate?.File, newTemplate?.Sheet, newTemplate?.Column, subjectId);
                return GetSingleValuesFromList(keyValuePairs, newTemplate?.Column, arrayResult);
            }
        }

我需要对上述功能进行任何更改吗?我可以申请线程吗?上面的代码如何实现异步功能?

【问题讨论】:

  • 包裹到任务中
  • 我已经在任务中完成了
  • 不,你不...标记方法异步不会在后台线程上调用。你需要开始新的任务

标签: c# multithreading async-await


【解决方案1】:

您确定需要对每个 id 都执行此操作吗?:

File.WriteAllText($"D:\out\awaitcheck{subjectId}.txt", stringBuilder.ToString());

编辑:这不需要为每个 subjectId 编写文件。改为这样做:

                foreach (var subjectId in subjectIds)
                {
                    var GetIcuDischargeTransform = icuDataTransform.GetIcuDischargeTransform(sourceJson, emrSchema, subjectId);
                    stringBuilder.Append($"var:GetIcuDischargeTransform({subjectId}): ").Append(" ").Append(DateTime.Now).AppendLine();
   
                    emrData.IcuDischarge = await GetIcuDischargeTransform;
                    stringBuilder.Append($"await:GetIcuDischargeTransform({subjectId}): ").Append(" ").Append(DateTime.Now).AppendLine();
                }
                File.WriteAllText($"D:\\out\\awaitcheck.txt", stringBuilder.ToString());

这将为每个文件编写一个文本文件,每个文件都比上一个文件大。有多少个id?那里可能有很多 IO。

动态类型不快:

List<Dictionary<string, dynamic>> ...

也许您可以使用特定的类型?如果不是,也许“对象”更好?您正在使用 'ref' 将此 keyValuePairs 变量传递给每个 getdata 方法,但它已经是一个引用类型,因此没有必要(但不太可能减慢它的速度)。

最后,有很多不同的方法来获取数据。这些都在做什么?有没有更快或更简单的方法来实现它?

编辑:

我看到您已经添加了 GetData 方法,但这也没有显示它调用的方法的作用。但我不确定这是否重要。我仍然不认为动态类型是必要的。我个人在我编写的所有代码中都完全避免它。

我希望从 json 获取数据的方法效率低下,并且可能会被正确定义的模型所取代,该模型代表 json 的预期内容。然后,您可以使用 NewtonSoft JSON 库简单地对其进行反序列化。

【讨论】:

  • 这是为了获取函数的执行时间。它有 8 个功能(但在代码中,未指定)。这只是为了知道函数的执行时间
  • 我们的输入是动态的。这就是我们使用动态的原因。列表> ...
  • 写入文本文件应该在循环之外,见编辑。
  • 另外,在不知道 CommonFunctions.GetData 方法的作用的情况下,我不能说是哪里出了问题。
  • 问题中添加了CommonFunctions.GetData方法。
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2019-11-03
相关资源
最近更新 更多