4

我在 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);触发大约需要1s;

我希望所有项目ListItem同时运行(这里是getData(item)),然后在 foreach 完成Console.write("Finish all").

我怎样才能做到这一点?任何想法将不胜感激!

4

3 回答 3

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。

于 2013-01-25T08:18:57.670 回答
1

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

既然您添加了有关使用 .net 3.5 的评论,我的答案可能会被省略。

于 2013-01-25T07:47:29.507 回答
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; }
    }

输出

在此处输入图像描述

于 2013-01-25T07:51:06.557 回答