1

这是我的代码,其中一个列表包含另外 2 个列表,其中WorkItem集合包含大量记录,例如7,000 it takes 10 min. 有没有办法让它更快,如果它是错误、任务或产品积压项目,case它正在决定 类型。workItem请告诉我如何使循环更快。循环 7,000 条记录需要 10 分钟,我们可以用threading它来加快速度吗?
已尝试使用锁定工作项列表的 parallel.for 但出现错误。“未找到序列”

public void GetProjectInfo(string projectname)
{
    string querystring = string.Format("select [System.Id], [System.Title],[Story.Author],[Story.Owner],[System.AssignedTo]," +
                    " [System.WorkItemType],[Microsoft.VSTS.Scheduling.StoryPoints],[Microsoft.VSTS.Common.Priority]," +
                    "[Microsoft.VSTS.Scheduling.Effort], [Actual.Effort.Completed]" +
                    ",[System.State]," +
                        public void GetProjectInfo(string projectname)
                    "[System.IterationPath]" +
                    " FROM WorkItemLinks" +
                    " WHERE" +
                    " ([Source].[System.TeamProject]='{0}'" +
                    " and [Source].[System.WorkitemType] IN ('Feature', 'Bug', 'Product Backlog Item', 'Task')" +
                    ")" + " and ([System.Links.LinkType]='System.LinkTypes.Hierarchy-Forward')" +
                    " ORDER BY [System.Id] " +  " mode (Recursive)", projectname);
    GetWorkItemTree(querystring);
}

private void GetWorkItemTree(string query)
{
    var treeQuery = new Microsoft.TeamFoundation.WorkItemTracking.Client.Query(_workitemstore, query);
    var links = treeQuery.RunLinkQuery();

    var workItemIds = links.Select(l => l.TargetId).ToArray();

    query = "SELECT * FROM WorkItems";
    var flatQuery = new Microsoft.TeamFoundation.WorkItemTracking.Client.Query(_workitemstore, query, workItemIds);
    var workItemCollection1 = flatQuery.RunQuery();

    var workItemList = new List<WorkItemViewModel>();

    for (int i = 0; i < workItemCollection.Count; i++)
    {
        var workItem = workItemCollection[i];

        if (workItem.Type.Name == "Product Backlog Item")
        {
            var model = new WorkItemViewModel()
            {
                FID = (workItem.WorkItemLinks.Count > 0) ? ((workItem.WorkItemLinks[0].LinkTypeEnd.Name.ToString() != "Child") ? workItem.WorkItemLinks[0].TargetId : 0) : 0,

                ID = workItem.Id,
                Name = workItem.Title,
                State = workItem.State,

                priorty = Convert.ToInt32(workItem.Fields["Priority"].Value),
                //   Size =(int) workItem.Fields["Size"].Value ,
                Size = Convert.ToInt32(workItem.Fields["Effort"].Value),

                StoryPoints = Convert.ToInt32(workItem.Fields["Story Points"].Value),
                DoneStatus = workItem.Fields["Done Status"].Value.ToString(),
                StoryOwner = workItem.Fields["Story Owner"].Value.ToString(),
                Assignedto = workItem.Fields["Assigned To"].Value.ToString(),
                StoryAuthor = workItem.Fields["Story Author"].Value.ToString(),
                IterationPath = workItem.IterationPath
            };

            workItemList.Add(model);
        }
        else
        {
            switch (workItem.Type.Name)
            {
                case "Task":
                    var task = new TFSTask()
                    {
                        Storyid = (workItem.WorkItemLinks.Count > 0) ? workItem.WorkItemLinks[0].TargetId : 0,
                        ID = workItem.Id,
                        name = workItem.Title,
                        //activity = workItem.Fields["MyCompany.Activity"].Value.ToString(),
                        //start = (DateTime?)workItem.Fields["MyCompany.ActivityStart"].Value,
                        //due = (DateTime?)workItem.Fields["MyCompany.ActivityFinish"].Value,
                        status = workItem.State,
                        IterationPath = workItem.IterationPath,
                        Assignedto = workItem.Fields["Assigned To"].Value.ToString(),

                        priorty = Convert.ToInt32(workItem.Fields["Priority"].Value),
                        effort = Convert.ToInt32(workItem.Fields["effort"].Value),
                        Completed = Convert.ToInt32(workItem.Fields["Completed"].Value)

                    };

                    if (task.Storyid != 0)
                    {
                        workItemList.Last().Tasks.Add(task);
                    }
                    break;
                case "Bug":
                    var bug = new TFSIssue()
                    {
                        Storyid = (workItem.WorkItemLinks.Count > 0) ? workItem.WorkItemLinks[0].TargetId : 0,
                        ID = workItem.Id,
                        Name = workItem.Title,
                        //start = (DateTime?)workItem.Fields["MyCompany.ActivityStart"].Value,
                        //due = (DateTime?)workItem.Fields["MyCompany.ActivityFinish"].Value,
                        State = workItem.State,
                        IterationPath = workItem.IterationPath,
                        Assignedto = workItem.Fields["Assigned To"].Value.ToString(),

                        priorty = Convert.ToInt32(workItem.Fields["Priority"].Value),
                        effort = Convert.ToInt32(workItem.Fields["effort"].Value),
                        // Completed = Convert.ToInt32(workItem.Fields["Completed"].Value)
                    };
                    if (bug.Storyid != 0)
                    {
                        workItemList.Last().Issues.Add(bug);
                    }
                    break;
                default:
                    break;
            }
        }
    }
}

public class WorkItemViewModel
{
    public string Name { get; set; }
    public int ID { get; set; }

    public string State { get; set; }
    // public DateTime? due { get; set; }
    public int priorty { get; set; }
    public int Size { get; set; }
    //  public int effort { get; set; }
    public int StoryPoints { get; set; }
    public string DoneStatus { get; set; }
    public string StoryOwner { get; set; }
    public string Assignedto { get; set; }
    public string StoryAuthor { get; set; }
    public string IterationPath { get; set; }
    public int FID { get; set; }
    public List<TFSIssue> Issues { get; set; }
    public List<TFSTask> Tasks { get; set; }

    public WorkItemViewModel()  // Added a public constructor
    {
        Issues = new List<TFSIssue>();
        Tasks = new List<TFSTask>();          
    }
}

public class TFSIssue
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime? Created { get; set; }

    public string State { get; set; }
    public DateTime? due { get; set; }
    public string IterationPath { get; set; }
    public string Assignedto { get; set; }
    public int priorty { get; set; }
    public int effort { get; set; }
    public int Storyid { get; set; }
    //  public int Completed { get; set; }
}

public class TFSTask
{
    public int ID { get; set; }
    public string name { get; set; }
    //  public string activity { get; set; }
    public string status { get; set; }
    //  public DateTime? start { get; set; }
    //  public DateTime? due { get; set; }
    public string IterationPath { get; set; }
    public string Assignedto { get; set; }
    public int priorty { get; set; }
    public int effort { get; set; }
    public int Completed { get; set; }
    public int Storyid { get; set; }
}
4

4 回答 4

0

尝试这样的事情:

var workItemList = new List<WorkItemViewModel>();

var t = workItemList.select(w => Task.Run(() => {
    // Put the work.
}));

await Task.WhenAll(t);
于 2018-02-25T21:52:48.270 回答
0

好的,下一步不是简单地对它进行多线程处理。

您的代码运行缓慢,并且您使用了 StopWatch 对象来尝试跟踪发生减速的位置。伟大的!但是,你不能停留在 100 行长的 For-Loop。 For 循环中花费的时间在哪里使用秒表来确定每个循环的哪个部分用于每个部分或每一行。你应该可以说,“这里的这条线每次需要 100 毫秒,超过 7000 个文档,这就是为什么它需要 10 分钟。”

现在,您可能处于使用慢代码或慢算法/方法来解决问题的位置。你应该先花精力修复然后弄清楚多线程是否会给你带来很好的改进。

于 2018-03-02T19:54:41.653 回答
0

这样的事情应该做:

IEnumerable<Data> LoadDataFromDatabase()
{ 
    return ...
}

void ProcessInParallel()
{
   while(true)
   {
      var data = LoadDataFromDatabase().ToList();

      if(!data.Any()) break;

      data.AsParallel().ForEach(ProcessSingleData);
   }
}

void ProcessSingleData(Data d)
{
  // do something with data
}
于 2018-02-27T08:06:05.390 回答
-2

看来你可以在这里使用线程,

也许 Parallel.For 可以帮助你。

于 2018-02-23T12:08:54.930 回答