public void Load(FrameGroup group, EventDescription desc)
        {
            if (Group == group && Description == desc)
            {
                return;
            }

            Group       = group;
            Description = desc;

            Task.Run(() =>
            {
                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    IsLoading = true;
                }));

                FunctionStats frameStats = null;

                if (group != null && desc != null)
                {
                    frameStats = new FunctionStats(group, desc);
                    frameStats.Load(Origin);
                }

                OnLoaded(frameStats);
            });
        }
 public virtual void OnLoaded(FunctionStats stats)
 {
     Application.Current.Dispatcher.BeginInvoke(new Action(() =>
     {
         Stats     = stats;
         IsLoading = false;
         OnChanged?.Invoke();
     }));
 }
        public override void OnLoaded(FunctionStats frameStats)
        {
            ObservableCollection <FunctionSummaryItem> items = GenerateSummaryItems(frameStats);

            Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                SummaryItems = items;
            }));

            base.OnLoaded(frameStats);
        }
        private ObservableCollection <FunctionSummaryItem> GenerateSummaryItems(FunctionStats frameStats)
        {
            ObservableCollection <FunctionSummaryItem> items = new ObservableCollection <FunctionSummaryItem>();

            if (frameStats != null)
            {
                items.Add(new MinMaxFunctionSummaryItem(frameStats.Samples.Select(s => s.Total))
                {
                    Icon        = (Style)Application.Current.FindResource("appbar_timer"),
                    Name        = "Time\\Frame(ms)",
                    Description = "Total duration of the function per frame in milliseconds",
                    Foreground  = Brushes.White,
                });

                items.Add(new MinMaxFunctionSummaryItem(frameStats.Samples.Select(s => s.Work))
                {
                    Icon        = (Style)Application.Current.FindResource("appbar_timer_play"),
                    Name        = "Work\\Frame(ms)",
                    Description = "Total work time of the function per frame in milliseconds (excluding synchronization and pre-emption)",
                    Foreground  = Brushes.LimeGreen,
                });


                items.Add(new MinMaxFunctionSummaryItem(frameStats.Samples.Select(s => s.Wait))
                {
                    Icon        = (Style)Application.Current.FindResource("appbar_timer_pause"),
                    Name        = "Wait\\Frame(ms)",
                    Description = "Total wait time of the function per frame in milliseconds (synchronization and pre-emption)",
                    Foreground  = Brushes.Tomato,
                });

                items.Add(new MinMaxFunctionSummaryItem(frameStats.Samples.Select(s => (double)s.Count))
                {
                    Icon        = (Style)Application.Current.FindResource("appbar_cell_function"),
                    Name        = "Calls\\Frame",
                    Description = "Average number of calls per frame",
                    Foreground  = Brushes.Wheat,
                });

                items.Add(new HyperlinkFunctionSummaryItem()
                {
                    Icon        = (Style)Application.Current.FindResource("appbar_page_code"),
                    Name        = "File",
                    Description = "Open Source Code",
                    Path        = frameStats.Description.Path,
                });
            }

            return(items);
        }