C#Winform中,我在查询数据时等待时间过长,想用一个进度条显示机器正在查询,请问如何实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#Winform中,我在查询数据时等待时间过长,想用一个进度条显示机器正在查询,请问如何实现?相关的知识,希望对你有一定的参考价值。

C#Winform中,我在查询数据时等待时间过长,想用一个进度条显示机器正在查询,请问如何实现?如果能显示当前查询到 百分之多少了就更好了,小弟在此谢过高手们!!!

我说下我的思路啊 不一定对 但是希望能对你有帮助
首先正式查询数据之前先查询下一共有多少跳记录 count一下 这个速度应该很快的
声明一个变量 currentNum 来记录当前取到多少条数据
然后用datareader来读取数据,每读一条currentNum累加
当前进度为currentNum / 总条数
这样用这样进度条就可以实现了 当然要在界面上显示 肯定是要做多线程处理的
参考技术A 用backgroundworker做多线程实现进度条比较简单,但是要把数据的进度百分比反馈出来好像比较困难本回答被提问者采纳 参考技术B 做后台语句查询,这个不好实现,要实现也很难。
实现需要返回值。
对前台操作的可以实现。
参考技术C 不客气 - -

SQL 查询执行时间过长。需要提高查询的性能

【中文标题】SQL 查询执行时间过长。需要提高查询的性能【英文标题】:SQL query takes too long to execute. Need to improve performance of query 【发布时间】:2022-01-06 06:54:42 【问题描述】:

我正在使用 SQL Server、.NET 5 环境。此 SQL 查询执行时间过长。这个查询等待时间几乎是 3 分钟,但只有 35 条记录。有没有更好的方法来优化这个查询?

var allmeetings = await _context.MeetingMaster
                                .Where(x => x.IsActive == true && 
                                            (x.MeetingParticipants.Any(y => y.ParticipantId == Convert.ToInt32(_currentUserService.CurrentUserId)) || 
                                             x.OrganizedById == Convert.ToInt32(_currentUserService.CurrentUserId)))
                                .Include(a => a.MeetingParticipants)
                                .ThenInclude(b => b.Participant)
                                .Include(a => a.MeetingAgendaItems)
                                .ThenInclude(e => e.MeetingActionItems)
                                .ThenInclude(w => w.ActionItemLogs)
                                .Include(a => a.MeetingAgendaItems)
                                .ThenInclude(e => e.MeetingActionItems)
                                .ThenInclude(w => w.ActionItemResposibilities)
                                .Include(g => g.MeetingAgendaItems)
                                .ThenInclude(v => v.MeetingAgendaItemTypes)
                                .ThenInclude(j => j.AgendaItemRef)
                                .Include(w => w.MeetingAgendaItems)
                                .ThenInclude(d => d.RestrictedAgendaItemList)
                                .ThenInclude(s => s.ParticipantRef)
                                .Include(s => s.MeetingAgendaItems)
                                .ThenInclude(q => q.MeetingAgendaItemSupportiveDocuments)
                                .Include(c => c.MonthsRef)
                                .Include(z => z.YearsRef)
                                .Include(g => g.MeetingMinutesDoc)
                                .Include(c => c.Project)
                                .Include(c => c.Category)
                                .Include(l => l.MeetingSuggestions)
                                .Include(q => q.MeetingMattersArises)
                                .ThenInclude(i => i.MattersAriseResponsibilities)
                                .ThenInclude(s => s.ResponsiblePerson)
                                .Include(e => e.MeetingMattersArises)
                                .ThenInclude(w => w.MattersAriseReviewerComments)
                                .Include(s => s.MeetingMattersArises)
                                .ThenInclude(e => e.MattersAriseLogs)
                                .AsSplitQuery()
                                .ToListAsync(cancellationToken);

var result = allmeetings.Where(x => x.IsActive == true && 
                                    x.isRecurringMeeting == false && 
                                    (x.MeetingParticipants.Any(y => y.ParticipantId == Convert.ToInt32(_currentUserService.CurrentUserId)) || x.OrganizedById == Convert.ToInt32(_currentUserService.CurrentUserId))).ToList();

var RecMeetings = allmeetings.Where(x => x.IsActive == true && 
                                         x.isRecurringMeeting == true && 
                                         (x.MeetingParticipants.Any(y => y.ParticipantId == Convert.ToInt32(_currentUserService.CurrentUserId)) || x.OrganizedById == Convert.ToInt32(_currentUserService.CurrentUserId))).ToList();

var groupedRecMeetings = RecMeetings.GroupBy(u => u.MeetingRefId.Substring(0, u.MeetingRefId.LastIndexOf('-'))).Select(grp => grp.ToList()).ToList();

var GraeterMeetings = new List<MeetingMaster>();
        
foreach (var met in groupedRecMeetings)

    result.AddRange(met.FindAll(x => x.MeetingStatus != "Initiated" ));
    GraeterMeetings.AddRange(met.FindAll(x => x.MeetingStatus == "Initiated"));

    if(GraeterMeetings.Count != 0)
    
        result.Add(GraeterMeetings.OrderBy(x => x.MeetingDate).First());
    

    GraeterMeetings.Clear();


return result.OrderByDescending(d => d.Id).ToList();

【问题讨论】:

请发布正在运行的确切 SQL 查询。如前所述,尚不清楚过滤条件是什么(WHERE)或行顺序是什么(ORDER BY)。 16 (!!!!) .Include 和 14 .ThenInclude - 你很惊讶它需要“很长时间”来收集数据!?! ?!?!?! 所有ToList 可能也无济于事。他们为什么在那里? 35 条记录,但可能有 16 + 14 条连接??你肯定需要所有这些吗? 这里是拆分查询,所以 30 个单独的查询,都带有连接和过滤器。 【参考方案1】:

首先,你有这么多的 Includes() 和 ThenIncludes(),如果这对你的性能真的很不利的话。有没有办法可以减少这些包括 -> 只使用必要的。

那么我希望您在语句末尾执行 .ToList() 查询(在您返回之前)

下面是我过去的示例(使用分页和过滤):

            var context = _context.People
                .Include(x => x.Parents)
                .ThenInclude(x => x.Adress)
                .Include(x => x.Job)
                .Include(x => x.Hobbies);

            var items = string.IsNullOrWhiteSpace(query)
                ? context
                : context.Where(x => x.Name.Contains(query));

            var filters = new List<int>();
            if (filter != null)
            
                filters = filter.Split(',').Select(int.Parse).ToList();
                items = items.Where(x => x.Parents.Select(s => s.AdressId).Any(z => filters.Any(y => y == z)));
            

            return await items.Skip(page * take).Take(take).ToListAsync();

【讨论】:

以上是关于C#Winform中,我在查询数据时等待时间过长,想用一个进度条显示机器正在查询,请问如何实现?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform combox 下拉框选项过长,显示不全,怎么解决

c#.net winform 选择性多条件查询数据库。

使用Ajax同步请求时,等待时间过长增加页面提示问题

C#,winform,怎样在一个页面显示前,首先先显示个等待提示?

MySQL innoDB:查询执行时间过长

winform的页面怎么判断页面首次加载,在线等待!谢谢了!