0

メソッドを何度も (1000 万回) 呼び出す必要があるため、スレッドを使用します。しかし、ループにメソッドの 100 サイクルがあると、OutOfMemoryException が発生します。SetMaxThreads を追加して、同時に 50 スレッドのみを実行しようとしましたが、機能しません (方法がわからないため)。前もって感謝します。

ThreadPool.SetMaxThreads(50, 50);
for (int i = 0; i < tablePersons.Rows.Count; i++)
{
    Thread t = new Thread(RegisterPerson);
    t.Start(tablePersons.Rows[i]);
}

static void RegisterPerson(object paramObject)
{
   DataRow person = (DataRow)paramObject;
   Call a service...
}
4

2 に答える 2

2

1)スレッドプールスレッドをユーザーが作成したスレッドと混同しています。

これにより、新しいスレッドが作成されます(スレッドプールスレッドではありません)。

Thread t = new Thread(RegisterPerson);

スレッドプールに最大50のスレッドがあることを確認します。

ThreadPool.SetMaxThreads(50, 50);

行ごとにユーザースレッドを作成しようとするループには影響しません。

スレッドプールに入るには、いくつかの方法があります。

  • タスク並列ライブラリ経由(Framework 4.0から)
  • ThreadPool.QueueUserWorkItemを呼び出すことによって
  • 非同期デリゲート経由
  • BackgroundWorker経由

2)それほど多くのユーザースレッドを作成するべきではありません。

私は読むことをお勧めします: C#でのJoeAlbahariの優れたスレッド

于 2013-02-05T14:35:59.953 に答える
1

多くの個別のスレッドを手動で作成するのではなく、おそらく Parallel.ForEach() を使用して、スレッドの作成を処理させる必要があります。すべてが同時に実行されるわけではありませんが、メモリの問題が発生することはありません。

于 2013-02-05T14:38:02.737 に答える