【问题标题】:Task returning wrong count of result in C#任务在 C# 中返回错误的结果计数
【发布时间】: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

【问题讨论】:

  • 您可能需要通过锁定提交列表以防止其他线程中的更改来保护提交的列表。
  • 小心,StartNewContinueWith 可能会导致您在 UI 线程上运行代码,当您希望代码在后台线程上运行时,您应该始终将 TaskSchedueller 传递给确保它没有或使用Task.Run( 而不是StartNew

标签: c# asynchronous task


【解决方案1】:

两种选择

  1. submitedList 更改为并发类型,例如ConcurrentBag&lt;T&gt;。期待您的后续问题,这里是why you can't just use a concurrent list :)

  2. Put a lock around all of your submitedList operations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多