6

Asp.net C# で問題が発生しました

私は以下のコードを持っています: List objectList = new List();

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

毎回「getData (item);」発火には約1秒かかります。

すべてのアイテムをlistItem同時に実行し、foreach終了後に実行したいConsole.write("Finish all")

どうやってやるの?

どんなアイデアでも大歓迎です!

4

4 に答える 4

5

Parallel.Foreachを試すことができます。各反復が並行して実行される場合があります。

于 2013-01-24T04:55:43.230 に答える
5

あなたはそれを成し遂げるために使うことができますTask

 var tasks = listItem.Select(item => Task.Factory.StartNew(() => aaa()));
 Task.WaitAll(tasks.ToArray());

 Console.Write();

すべてのタスクが完了するのを待つ必要がない場合は、スキップしてWaitAllください:

 var tasks = listItem.Select(item => Task.Factory.StartNew(() => aaa()));
 Console.Write();

.NET 3.5 の場合、ThreadPool を使用できます。

 listItem.ForEach(item => ThreadPool.QueueUserWorkItem(state => aaa()));
 Console.Write();
于 2013-01-24T04:57:30.653 に答える
5
 using System.Threading;
 using System.Threading.Tasks;

 List<Task> tasks = new List<Task>();
 foreach(item in listItem)
 {
       tasks.Add(Task.Factory.StartNew(() => aaa()));
 }
// If you want the Console.Writeline to execute immediately after starting the tasks
Console.Writeline();            
Task.WaitAll(tasks.ToArray());
Console.Writeline("Finised executing all tasks");


スレッドを使用してこれを行う場合は、次のことができます。

List<ManualResetEvent> resetEvents = new List<ManualResetEvent>();
.
.
.


 foreach(item in lisItem)
            {
                Thread thread = new Thread(new ParameterizedThreadStart(aaa));
                ManualResetEvent resetEvent = new ManualResetEvent(false);
                resetEvents.Add(resetEvent);
                thread.Start(resetEvent);

            }
            Console.WriteLine();
            WaitHandle.WaitAll(resetEvents.ToArray<WaitHandle>());
            Console.WriteLine("Finised executing all threads");


        }

}
.
.
.

    void aaa(object data)
    {
        ManualResetEvent resetEvent = data as ManualResetEvent;
        // completed execution
        Console.WriteLine(".");
        resetEvent.Set();
    }
于 2013-01-24T04:59:05.350 に答える