首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步函数WIthin异步循环

异步函数WIthin异步循环
EN

Stack Overflow用户
提问于 2019-11-12 13:25:25
回答 1查看 76关注 0票数 0

我正在尝试运行一个异步方法,该方法有一个循环来从mySQL数据库加载一些数据。

Await函数不会停止其他任务的并发运行,但它们都是相互依赖的。

现在的结果是重复的DataGrid条目,但是DataGrid确实异步加载。在新的程序开始时,一切正常,没有任何重复-不确定为什么会发生这种情况!

如何在异步循环中调用返回数据的异步函数?

代码语言:javascript
复制
        private async void LoadAsync_ProviderReport()
        {
            Progress.Visibility = Visibility.Visible;
            DataGrid.Opacity = 0.3;
            string FromDate = FromDatePicker.Date.Value.ToString("yyyy-MM-dd");
            string ToDate = ToDatePicker.Date.Value.ToString("yyyy-MM-dd");
            ProviderReport.Clear();
            await Get_ProviderReport(FromDate, ToDate, DataGrid) ;
            Progress.Visibility = Visibility.Collapsed;
            DataGrid.Opacity = 1;
        }

private async Task<ObservableCollection<ProviderReport>> Get_ProviderReport(string FromDate, string ToDate, DataGrid DG)
        {
            ProviderReport.Clear();

            ProviderReport ptotal = new ProviderReport();
            AcrylicBrush brush2 = new AcrylicBrush();
            brush2.TintColor = Windows.UI.Color.FromArgb(0, 150, 150, 150);
            brush2.TintLuminosityOpacity = 0.6;
            brush2.BackgroundSource = 0;
            brush2.TintOpacity = 0.8;
            ptotal.ProvBrush = brush2;
            ptotal.Provider = "Practice Total";
            decimal PracticeProduction = 0;
            decimal PracticeAdjustments = 0;
            decimal PracticeWriteoffs = 0;
            decimal PracticeIncome = 0;
            decimal PracticeNetProduction = 0;
            decimal PracticeWorkedDays = 0;
            decimal PracticeWorkedHours = 0;
            decimal PracticeApptsNumbers = 0;
            decimal PracticeApptsHours = 0;
            decimal PracticeApptsBroken = 0;
            decimal PracticePtsSeen = 0;
            decimal PracticePtsReappointed = 0;

            foreach (DataRow ProviderRow in Providers.Rows)
            {               
                // Practice Total Row
                int ProvNum = Int32.Parse(ProviderRow["ProvNum"].ToString());
                Style ProvStyle = ProviderRow["ProvStyle"] as Style;
                Brush ProvBrush = ProviderRow["ProvBrush"] as Brush;
                string Provider = ProviderRow["Abbr"].ToString() + " - " + ProviderRow["FName"].ToString() + " " + ProviderRow["LName"].ToString();

                decimal Production = await SQL.Functions.GetValue(SQL.Queries.Production, FromDate, ToDate, ProvNum);
                decimal Adjustments = await SQL.Functions.GetValue(SQL.Queries.Adjustments, FromDate, ToDate, ProvNum);
                decimal Writeoffs = await SQL.Functions.GetValue(SQL.Queries.Writeoffs, FromDate, ToDate, ProvNum);
                decimal Income = await SQL.Functions.GetValue(SQL.Queries.Income, FromDate, ToDate, ProvNum);
                decimal NetProduction = Production - Adjustments + Writeoffs;
                decimal WorkedDays = await SQL.Functions.GetValue(SQL.Queries.WorkedDays, FromDate, ToDate, ProvNum);
                decimal WorkedHours = await SQL.Functions.GetValue(SQL.Queries.WorkedHours, FromDate, ToDate, ProvNum);
                decimal ApptsNumbers = await SQL.Functions.GetValue(SQL.Queries.ApptsNumbers, FromDate, ToDate, ProvNum);
                decimal ApptsHours = await SQL.Functions.GetValue(SQL.Queries.ApptsHours, FromDate, ToDate, ProvNum);
                decimal ApptsBroken = await SQL.Functions.GetValue(SQL.Queries.ApptsBroken, FromDate, ToDate, ProvNum);
                decimal PtsSeen = await SQL.Functions.GetValue(SQL.Queries.PtsSeen, FromDate, ToDate, ProvNum);
                decimal PtsReappointed = await SQL.Functions.GetValue(SQL.Queries.PtsReappointed, FromDate, ToDate, ProvNum);

                PrintButton.Content = "Loading :" + Provider;

                PracticeProduction += Production;
                PracticeAdjustments += Adjustments;
                PracticeWriteoffs += Writeoffs;
                PracticeIncome += Income;
                PracticeNetProduction += NetProduction;
                PracticeWorkedDays += WorkedDays;
                PracticeWorkedHours += WorkedHours;
                PracticeApptsNumbers += ApptsNumbers;
                PracticeApptsHours += ApptsHours;
                PracticeApptsBroken += ApptsBroken;
                PracticePtsSeen += PtsSeen;
                PracticePtsReappointed += PtsReappointed;

                //Each Selected Provider Row
                bool ProvSelected = Convert.ToBoolean(ProviderRow["Selected"]);
                if (ProvSelected == true)
                {
                    ProviderReport pr = new ProviderReport();
                    pr.ProvNum = ProvNum;
                    pr.ProvStyle = ProvStyle;
                    pr.ProvBrush = ProvBrush;
                    pr.Provider = Provider;
                    pr.Production = Production;
                    pr.Adjustments = Adjustments;
                    pr.Writeoffs = Writeoffs;
                    pr.Income = Income;
                    pr.NetProduction = NetProduction;
                    pr.WorkedDays = WorkedDays;
                    pr.WorkedHours = WorkedHours;
                    pr.ApptsNumbers = ApptsNumbers;
                    pr.ApptsHours = ApptsHours;
                    pr.ApptsBroken = ApptsBroken;
                    pr.PtsSeen = PtsSeen;
                    pr.PtsReappointed = PtsReappointed;
                    ProviderReport.Add(pr);
                }
            }

            //SubTotal Row
            decimal TotalProduction = 0;
            decimal TotalAdjustments = 0;
            decimal TotalWriteoffs = 0;
            decimal TotalIncome = 0;
            decimal TotalNetProduction = 0;
            decimal TotalWorkedDays = 0;
            decimal TotalWorkedHours = 0;
            decimal TotalApptsNumbers = 0;
            decimal TotalApptsHours = 0;
            decimal TotalApptsBroken = 0;
            decimal TotalPtsSeen = 0;
            decimal TotalPtsReappointed = 0;
            foreach (ProviderReport p in ProviderReport)
            {
                TotalProduction += p.Production;
                TotalAdjustments += p.Adjustments;
                TotalWriteoffs += p.Writeoffs;
                TotalIncome += p.Income;
                TotalNetProduction += p.NetProduction;
                TotalWorkedDays += p.WorkedDays;
                TotalWorkedHours += p.WorkedHours;
                TotalApptsNumbers += p.ApptsNumbers;
                TotalApptsHours += p.ApptsHours;
                TotalApptsBroken += p.ApptsBroken;
                TotalPtsSeen += p.PtsSeen;
                TotalPtsReappointed += p.PtsReappointed;
            }
            ProviderReport psubtotal = new ProviderReport();
            psubtotal.Provider = "Selected Providers Total";

            AcrylicBrush brush = new AcrylicBrush();
            brush.TintColor = Windows.UI.Color.FromArgb(0, 200, 200, 200);
            brush.TintLuminosityOpacity = 0.6;
            brush.BackgroundSource = 0;
            brush.TintOpacity = 0.8;
            psubtotal.ProvBrush = brush;

            psubtotal.Production = SubTotals.Production = TotalProduction;
            psubtotal.Adjustments = SubTotals.Adjustments = TotalAdjustments;
            psubtotal.Writeoffs = SubTotals.Writeoffs = TotalWriteoffs;
            psubtotal.Income = SubTotals.Income = TotalIncome;
            psubtotal.NetProduction = SubTotals.NetProduction = TotalNetProduction;
            psubtotal.WorkedDays = SubTotals.WorkedDays = TotalWorkedDays;
            psubtotal.WorkedHours = SubTotals.WorkedHours = TotalWorkedHours;
            psubtotal.ApptsNumbers = SubTotals.ApptsNumbers = TotalApptsNumbers;
            psubtotal.ApptsHours = SubTotals.ApptsHours = TotalApptsHours;
            psubtotal.ApptsBroken = SubTotals.ApptsBroken = TotalApptsBroken;
            psubtotal.PtsSeen = SubTotals.PtsSeen = TotalPtsSeen;
            psubtotal.PtsReappointed = SubTotals.PtsReappointed = TotalPtsReappointed;
            ProviderReport.Add(psubtotal);

            // Practice Total Row
            ptotal.Production = PracticeTotals.Production = PracticeProduction;
            ptotal.Adjustments = PracticeTotals.Adjustments = PracticeAdjustments;
            ptotal.Writeoffs = PracticeTotals.Writeoffs = PracticeWriteoffs;
            ptotal.Income = PracticeTotals.Income = PracticeIncome;
            ptotal.NetProduction = PracticeTotals.NetProduction = PracticeNetProduction;
            ptotal.WorkedDays = PracticeTotals.WorkedDays = PracticeWorkedDays;
            ptotal.WorkedHours = PracticeTotals.WorkedHours = PracticeWorkedHours;
            ptotal.ApptsNumbers = PracticeTotals.ApptsNumbers = PracticeApptsNumbers;
            ptotal.ApptsHours = PracticeTotals.ApptsHours = PracticeApptsHours;
            ptotal.ApptsBroken = PracticeTotals.ApptsBroken = PracticeApptsBroken;
            ptotal.PtsSeen = PracticeTotals.PtsSeen = PracticePtsSeen;
            ptotal.PtsReappointed = PracticeTotals.PtsReappointed = PracticePtsReappointed;
            ProviderReport.Add(ptotal);

            //Return Data
            DG.DataContext = ProviderReport;
            return ProviderReport;
        }

public async Task<decimal> GetValue(string query, string FromDate, string ToDate, int ProvNum)
        {                
            var ParametersName = new List<string>() { "@FromDate", "@ToDate", "@ProvNum" };
            var ParametersValue = new List<string>() { FromDate, ToDate, ProvNum.ToString() };
            var DT = new DataTable();
            DT = await Task.Run(() => ExecuteMySQLQuery(query, ParametersName, ParametersValue)); ;
            decimal Output = default(decimal);
            try
            {
                if (DT.Rows.Count == 1)
                { Output = Convert.ToDecimal(DT.Rows[0][0]); }
                else
                { Output = Convert.ToDecimal(DT.Rows.Count); }

            }
            catch (Exception ex)
            {
                Output = Convert.ToDecimal("0");
            }
            return (Output);
        }

“”“

First Run Results onNavigatedTo

Run From DateChangeEvent

EN

回答 1

Stack Overflow用户

发布于 2019-11-13 07:25:34

这是另一个多次调用Get_ProviderReport方法的方法!

似乎你已经找到了问题的原因,那么最根本的解决方案就是调整代码的结构,控制触发事件的顺序。

毕竟,多次调用一个方法意味着多次查询,这对软件的性能有很大的影响。

但也有一种直接的方法。我不知道你的ProviderReport是什么,但它看起来像一个集合。在将数据填充到DataGrid之前,我们可以使用LinQ执行重复数据消除。

在此之前,请确保已重写Equal ProviderReport**.**的方法

代码语言:javascript
复制
ProviderReport.Distinct();

DG.DataContext = ProviderReport;

诚挚的问候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58812535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档