3

在下面的示例中,只有 _DisplayUsingThreads(timesToDisplay) 真正并行执行操作。而另外两个 _DisplayUsingTasks 和 _DisplayUsingDelegates 一次只执行 4 次(在四核机器上),然后等待一秒钟再执行 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

这是使用线程池线程的结果,TaskBeginInvoke创建您自己的线程则创建了一个线程。

添加ThreadPool.SetMinThreads(50, 0);btnGo_Click观察会发生什么。

于 2013-03-20T04:35:26.640 回答
0

可以排队到线程池的操作数量仅受可用内存的限制;但是,线程池限制了进程中可以同时处于活动状态的线程数。从 .NET Framework 4 开始,进程的线程池的默认大小取决于几个因素,例如虚拟地址空间的大小。

于 2013-03-20T07:19:45.713 回答