繁体   English   中英

Thread.Sleep()的Tasks / Thread / Delegate.beginInvoke

[英]Tasks/Thread/Delegate.beginInvoke with Thread.Sleep()

在下面的示例中,只有_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);
            }

        }

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM