[英]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);
}
}
这是使用线程池线程的Task
和BeginInvoke
的结果,而创建自己的线程则创建一个线程。
添加ThreadPool.SetMinThreads(50, 0);
到btnGo_Click
并观察会发生什么。
可以排队到线程池的操作数仅受可用内存的限制; 但是,线程池会限制同时在进程中处于活动状态的线程数。 从.NET Framework 4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.