⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class1.cs

📁 原代码详细说明是关于c++方面的希望可以帮助大家使用
💻 CS
字号:
using System;
using System.Collections;
using System.Threading;

// 这是用来保存信息的数据结构,将作为参数传递
public class SomeState
{
	public int Cookie;
	public SomeState(int iCookie)
	{
		Cookie = iCookie;
	}
}

public class Alpha
{
	public Hashtable HashCount;
	public ManualResetEvent eventX;
	public static int iCount = 0;
	public static int iMaxCount = 0;
	public Alpha(int MaxCount) 
	{
		HashCount = new Hashtable(MaxCount);
		iMaxCount = MaxCount;
	}
	// Beta 是一个当工作项在线程池中获得服务时要调用的方法。
	// 也就是说,当线程池具有可用于工作项的线程时,调用该方法。
	public void Beta(object state)
	{
		// 写出当前线程的哈希代码和 Cookie
		Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(),((SomeState)state).Cookie);
		// lock 关键字允许对 可通过多个线程访问的变量进行线程安全的修改。
		Console.WriteLine( "HashCount.Count=={0}, Thread.CurrentThread.GetHashCode()=={1}",
			HashCount.Count, 
			Thread.CurrentThread.GetHashCode());
		lock (HashCount) 
		{
			if (!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode()))
				HashCount.Add (Thread.CurrentThread.GetHashCode(), 0);
			HashCount[Thread.CurrentThread.GetHashCode()] = 
				((int)HashCount[Thread.CurrentThread.GetHashCode()])+1;
		}

		// 执行一些繁忙的操作。
		// 注意: 根据计算机速度的不同,如果
		// 增加此数字,则线程
		// 负载的分布范围应更宽。
		int iX  = 1000;
		Thread.Sleep(iX);
		// Interlocked.Increment 方法允许对
		// 可通过多个线程访问的变量进行线程安全的修改。
		Interlocked.Increment(ref iCount);
		if (iCount == iMaxCount)
		{
			Console.WriteLine();
			Console.WriteLine("设置信号,表明所有线程运行完");
			eventX.Set();
		}
	}
}

public class SimplePool
{
	public static int Main(string[] args)
	{
		Console.WriteLine("线程池实例:");
		bool W2K = false;   //用于表名当前操作系统是否支持线程池
		int MaxCount = 5;  // 池中总共允许存在 5 个线程
		// 将此事件标记为不发出信号。
		ManualResetEvent eventX = new ManualResetEvent(false);
		Console.WriteLine("加入 {0} 项目到线程池", MaxCount);
		Alpha oAlpha = new Alpha(MaxCount);  // 创建工作项。
		// 确保工作项具有对发信号事件的引用。
		oAlpha.eventX = eventX;
		Console.WriteLine("线程 0");
		try
		{
			// 对工作项进行排队,此操作的附加作用是检查哪个操作系统正在运行。
			ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(0));
			W2K = true;
		}
		catch (NotSupportedException)
		{
			Console.WriteLine("这些 API 在非Windows 2000 以上的系统上调用失败.");
			W2K = false;
		}
		if(W2K)  // 如果正运行于支持 ThreadPool 方法的操作系统。
		{
			for(int iItem=1;iItem < MaxCount;iItem++)
			{
				// 对工作项进行排队:
				Console.WriteLine("线程 {0}", iItem);
				ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta),new SomeState(iItem));
			}
			Console.WriteLine("等待线程池的线程用完");
			// 对 exventX.WaitOne 的调用将对此事件进行设置以使其等待直到eventX.Set() 发生。
			// 等到事件激发为止,也就是说 eventX.Set() 被调用:
			eventX.WaitOne(Timeout.Infinite,true);
			// WaitOne 直到发出此事件的信号后才会返回。
			Console.WriteLine("线程池的线程用完 (Event fired)");
			Console.WriteLine();
			Console.WriteLine("实际负载的线程");
			foreach(object o in oAlpha.HashCount.Keys)
				Console.WriteLine("{0} {1}", o, oAlpha.HashCount[o]);
		}
		return 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -