[英]Use Multi-threading to make looping faster - In which element is adding in list in loop?
[英]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.