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);に約 1 秒かかります。

のすべてのアイテムを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

こんにちは、このコンソール アプリケーション コードを実行し、foreach と Parallel.Foreach を使用して結果を比較してください。基本的に Parallel は、実行時間の長いタスクや時間がかかりすぎるタスクに役立ちます。

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 に答える
1

Parallel.ForEach / For を使用して、すべての項目に対して非同期で getData を実行します。Paralle.ForEach / For は、すべての反復が完了するまで戻りません。

.net 3.5 の使用に関するコメントを追加したので、私の答えは省略される可能性があります。

于 2013-01-25T07:47:29.507 に答える