【发布时间】:2016-06-14 23:18:03
【问题描述】:
我正在使用 Task.Factory.StartNew 异步调用 Sync 方法。异步完成后,我需要它的结果。我正在并行运行此任务并将每个结果组合成如下结果 -
public List<Nomination> Submit(List<Nomination> nominations, string userEmail)
{
var sublist = new List<Nomination>();
int nSize = 5;
var submitedList = new List<Nomination>();
List<Task> tasks = new List<Task>();
for (int index = 0; index < nominations.Count; index += nSize) // No nominations in a batch
{
sublist = nominations.GetRange(index, Math.Min(nSize, nominations.Count - index));
//SubmitNomination is sync method which does some db operation and returns a List<Nomination>
Task<List<DTO.FeedbackRequest>> task = Task.Factory.StartNew( () => { return SubmitNomination(sublist, userEmailName); });
Task cont = task.ContinueWith(submitted => {
submitedList.AddRange(submitted.Result);
});
tasks.Add(cont);
}
Task.WaitAll(tasks.ToArray());
return submitedList;
}
当我看到提交的列表时,我得到的列表计数一直在变化。这应该是作为输入的提名计数。
请告诉我如何解决这个问题。
非常感谢,Thirumalai M
【问题讨论】:
-
您可能需要通过锁定提交列表以防止其他线程中的更改来保护提交的列表。
-
小心,StartNew 和 ContinueWith 可能会导致您在 UI 线程上运行代码,当您希望代码在后台线程上运行时,您应该始终将
TaskSchedueller传递给确保它没有或使用Task.Run(而不是StartNew
标签: c# asynchronous task