要列出的异步添加元素

时间:2013-01-25 07:22:19

标签: c# asp.net asynchronous

我在Asp.net C#, .net 3.5

中遇到了问题

我有以下代码:

List<object> objectList = new List<object>();

foreach(var item in listItem)
{
  object obj = getData (item);
  objectList.add(obj);
}
Console.Write("Finish all");

每次getData (item);点火大约需要1秒;

我希望ListItem中的所有项目同时运行(此处为getData(item)),然后在foreach完成Console.write("Finish all")后执行。

我该怎么做? 任何想法将不胜感激!

3 个答案:

答案 0 :(得分:2)

您可以使用ThreadPoolManualResetEvent

int itemCount = listItem.Length;
List<object> objectList = new List<object>();
ManualResetEvent[] resetEvents = new ManualResetEvent[itemCount];

for (int i = 0; i < itemCount; i++)
{
    var item = listItem[i];

    resetEvents[i] = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(new WaitCallback((object index) =>
    {
        object obj = getData(item);

        lock (objectList)
            objectList.add(obj);

        resetEvents[(int)index].Set();
    }), i);
}

WaitHandle.WaitAll(resetEvents);
Console.Write("Finish all");

ThreadPool将在后台运行任务,当前线程将等待所有工作人员完成ManualResetEvent。

答案 1 :(得分:1)

使用Parallel.ForEach / For以异步方式为所有项执行getData。 Paralle.ForEach /在所有迭代完成之前不会返回。

现在您添加关于使用.net 3.5的评论,我的答案可能会被忽略。

答案 2 :(得分:1)

您只需运行此控制台应用程序代码,并使用foreach和Parallel.Foreach比较结果。基本上并行在长时间运行的任务或那些消耗太多时间的任务中很有用。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<object> objectList = new List<object>();
            var listItem = new List<Person> { new Person { Id = 1, Name = "Person 1" }, new Person { Id = 2, Name = "Person 2" }, new Person { Id = 3, Name = "Person 3" } , new Person { Id = 4, Name = "Person 4" } };
            var start = DateTime.Now;
            var parallelList = listItem;
            //using foreach
            foreach (var item in listItem)
            {
                object obj = getData(item);
                objectList.Add(obj);
            }
            var end = DateTime.Now.Subtract(start).TotalSeconds;
            Console.Write("\nUsing foreach...Finish all in " + end + " second \n");

            start = DateTime.Now;
            //using Parallel
            Parallel.ForEach(parallelList, item =>
            {
                object obj = getData(item);
                objectList.Add(obj);
            });
            end = DateTime.Now.Subtract(start).TotalSeconds;
            Console.Write("Using Parallel...Finish all in "+ end +" second");
            Console.ReadLine();
        }

        private static object getData(Person item)
        {
            Thread.Sleep(1000);
            return "Test Object " + item.Id;
        }
    }
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

<强>输出

enter image description here