BuildMonitor.BuildEventProcessor.SendErrorDetails C# (CSharp) Method

SendErrorDetails() public method

public SendErrorDetails ( IVsTaskList errorList ) : System.Threading.Tasks.Task
errorList IVsTaskList
return System.Threading.Tasks.Task
        public Threading.Task SendErrorDetails(IVsTaskList errorList)
        {
            Threading.Task processTaskListTask = new System.Threading.Tasks.Task(() =>
            {
                _processorStopwatch.Start();

                IVsEnumTaskItems taskEnum = null;
                IVsTaskItem[] oneItem = new IVsTaskItem[1];

                if (errorList != null)
                {
                    try {
                        errorList.EnumTaskItems(out taskEnum);

                        if (taskEnum != null)
                        {
                            int maxItems = 10000;
                            Int32.TryParse(Properties.Resources.MaxErrorsToProcess, out maxItems);

                            taskEnum.Next(1, oneItem, null);
                            for (int i = 0; (i < maxItems) && (oneItem[0] != null); ++i)
                            {
                                ProcessTaskListItem(oneItem[0]);
                                taskEnum.Next(1, oneItem, null);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Dictionary<string, string> exceptionDetails = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
                        exceptionDetails.Add("BuildId", _currentBuildGuid.ToString());
                        exceptionDetails.Add("ProjectId", _firstIslandwoodProjectGuid.ToString());
                        exceptionDetails.Add("Exception", e.GetType().ToString());
                        exceptionDetails.Add("Message", e.Message);
                        exceptionDetails.Add("InnerException", (e.InnerException == null ? "null" : e.InnerException.GetType().ToString()));
                        exceptionDetails.Add("InnerMessage", (e.InnerException == null ? "null" : e.InnerException.Message));
                        BuildTelemetryClient.TrackEvent("IslandwoodBuildMonitorException", exceptionDetails, null);
                    }
                    finally
                    {
                        // send all events in case the Visual Studio instance is closed or solution unloaded
                        BuildTelemetryClient.FlushEvents();
                    }
                }

                _processorStopwatch.Stop();

                Dictionary<string, string> perfProperties = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
                perfProperties.Add("BuildId", _currentBuildGuid.ToString());
                perfProperties.Add("ProjectId", _firstIslandwoodProjectGuid.ToString());

                Dictionary<string, double> perfMetrics = new Dictionary<string, double>(StringComparer.OrdinalIgnoreCase);
                perfMetrics.Add("ProcessTasks", _processorStopwatch.ElapsedMilliseconds);

                BuildTelemetryClient.TrackEvent("IslandwoodBuildMonitorPerformance", perfProperties, perfMetrics);

                // reset state in case projects/solutions are unloaded before next build
                _firstIslandwoodProjectGuid = Guid.Empty;
            });

            processTaskListTask.Start();

            return processTaskListTask;
        }

Usage Example

        private void ProcessBuildDoneEvents(vsBuildScope scope, vsBuildAction action)
        {
            if (_eventProcessor.HasIslandwoodProjects())
            {
                IVsTaskList errorList = GetService(typeof(SVsErrorList)) as IVsTaskList;

                _eventProcessor.SendErrorDetails(errorList);
            }
        }