2016-06-14 264 views
0

我使用Task.Factory.StartNew异步调用Sync方法。一旦异步完成,我需要它的结果。我并行运行这个任务,每个结果在下面的结果相结合 -在C#中返回错误计数结果的任务

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; 
} 

当我看到submitedList,我收到清单的计数改变所有的时间。它假设是作为输入的提名数。

请你让我知道如何解决这个问题。

非常感谢,包括Thirumalai中号

+0

您可能需要通过锁定对其他线程的变化,以保护所提交的名单。 – BugFinder

+0

请注意,[StartNew](http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html)和[ContinueWith](http://blog.stephencleary.com/2013/10/continuewith -is-dangerous-too.html)可以让你在UI线程上运行代码,当你期望它在后台线程上运行时,你应该总是传入一个'TaskSchedueller'来确保它没有或者使用Task .Run('代替'StartNew' –

+0

相关:https://stackoverflow.com/questions/9877358/multiple-threads-adding-elements-to-one-list-why-are-there-always-fewer-items-一世 –

回答