3

以下の例では、_DisplayUsingThreads(timesToDisplay) のみが実際に並列操作を行います。他の 2 つの _DisplayUsingTasks と _DisplayUsingDelegates は一度に 4 つしか実行せず (クアッド コア マシン上)、1 秒待ってからさらに 4 つ実行します。なんで?

public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            delegate void DisplayDelegate();
            DisplayDelegate myDisplaySleep;

            private void btnGo_Click(object sender, EventArgs e)
            {
              const int timesToDisplay = 50;

                //_DisplayUsingDelegates(timesToDisplay);
                //_DisplayUsingTasks(timesToDisplay);
                //_DisplayUsingThreads(timesToDisplay);
            }

            private void _DisplayUsingTasks(int displayNumber)
            {
                for (int i = 0; i < displayNumber; i++)
                {
                    Task task = new Task(DisplayIdSleep);
                    task.Start();
                }

            }

            private void _DisplayUsingThreads(int displayNumber)
            {
                for (int i = 0; i < displayNumber; i++)
                {
                    Thread thread = new Thread(DisplayIdSleep);
                    thread.Start();
                }
            }
            private void _DisplayUsingDelegates(int displayNumber)
            {
                myDisplaySleep = DisplayIdSleep;

                for (int i = 0; i < displayNumber; i++)
                {
                    myDisplaySleep.BeginInvoke(null, null);
                }
            }

            private void DisplayIdSleep()
            {
                Debug.WriteLine("Thread Id : {0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            }

        }
4

2 に答える 2

4

Taskこれはスレッド プール スレッドを使用した結果ですがBeginInvoke、独自のスレッドを作成するとスレッドが作成されます。

に追加ThreadPool.SetMinThreads(50, 0);してbtnGo_Click、何が起こるかを観察します。

于 2013-03-20T04:35:26.640 に答える
0

スレッドプールにキューに入れることができる操作の数は、使用可能なメモリによってのみ制限されます。ただし、スレッドプールは、プロセスで同時にアクティブにできるスレッドの数を制限します。.NET Framework 4以降、プロセスのスレッドプールのデフォルトのサイズは、仮想アドレス空間のサイズなどのいくつかの要因によって異なります。

于 2013-03-20T07:19:45.713 に答える