簡體   English   中英

包含2個以上列表的列表在循環中的運行速度很慢,我可以使用Thread來加快速度嗎?

[英]A list containing 2 more lists works slow in looping can i use Thread to make this faster?

這是我的代碼,其中一個列表包含另外2個列表,其中WorkItem集合包含大量記錄,例如7,000 it takes 10 min條記錄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; }
}

嘗試這樣的事情:

var workItemList = new List<WorkItemViewModel>();

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

await Task.WhenAll(t);

這樣的事情應該做:

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
}

好的,下一步不是簡單地對此進行多線程處理。

您有運行緩慢的代碼,並且已使用StopWatch對象嘗試跟蹤發生減速的位置。 大! 但是,您不能在100行長的循環中停下來。 時間在For循環中的何處 使用秒表來找出每個循環的哪一部分花在每個部分或每一行上。 您應該能夠說:“此行每次要花費100毫秒,並且需要7000多個文檔,這就是為什么要花費10分鍾的原因。”

現在,您可能處於慢速代碼或慢速算法/問題解決方案的位置。 您應該先花精力解決該問題 然后弄清楚多線程是否會給您帶來很好的改進。

看來您可以在這里使用線程,

也許Parallel.For可以幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM