线程池使用
(一)在线程池中调用委托


代码class Program { private delegate string RunOnThreadPool(out int threadId); static void Main(string[] args) { int threadId = 0; RunOnThreadPool poolDelegate = Test; var t = new Thread(() => Test(out threadId)); t.Start(); t.Join(); Console.WriteLine("Main: Thread id: {0}", threadId); IAsyncResult r = poolDelegate.BeginInvoke(out threadId, Callback, "a delegate asynchronous call"); r.AsyncWaitHandle.WaitOne(); //此处没程序也可以正常执行。不一定要等待 string result = poolDelegate.EndInvoke(out threadId, r); //得到Test()方法返回的结果。且此时终止了Test()执行,同时启动异步Callback()执行。 Console.WriteLine("Main: Thread pool worker thread id: {0}", threadId); Console.WriteLine(result); Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine("Main: End......."); Console.ReadKey(); } private static void Callback(IAsyncResult ar) { Console.WriteLine("Callback: Starting a callback..."); Console.WriteLine("Callback: State passed to a callbak: {0}", ar.AsyncState); Console.WriteLine("Callback: Is thread pool thread: {0}", Thread.CurrentThread.IsThreadPoolThread); Console.WriteLine("Callback: Thread pool worker thread id: {0}", Thread.CurrentThread.ManagedThreadId); } private static string Test(out int threadId) { Console.WriteLine("Test: Starting..."); Console.WriteLine("Test: Is thread pool thread: {0}", Thread.CurrentThread.IsThreadPoolThread); Thread.Sleep(TimeSpan.FromSeconds(2)); threadId = Thread.CurrentThread.ManagedThreadId; return string.Format("Test: Thread pool worker thread id was: {0}", threadId); } }
代码分析(见下图)

(二)线程操作中的临界区问题


代码class Program { static void Main(string[] args) { Console.WriteLine("Incorrect counter"); var c = new Counter(); var t1 = new Thread(() => TestCounter(c)); var t2 = new Thread(() => TestCounter(c)); var t3 = new Thread(() => TestCounter(c)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Total count: {0}", c.Count); Console.WriteLine("--------------------------"); Console.WriteLine("Correct counter"); var c1 = new CounterWithLock(); t1 = new Thread(() => TestCounter(c1)); t2 = new Thread(() => TestCounter(c1)); t3 = new Thread(() => TestCounter(c1)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Total count: {0}", c1.Count); Console.ReadKey(); } static void TestCounter(CounterBase c) { Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId); for (int i = 0; i < 5; i++) { c.Increment(); c.Decrement(); } } class Counter : CounterBase { public int Count { get; private set; } public override void Increment() { Count++; Console.WriteLine("++ Count={0} 线程ID={1}", Count, Thread.CurrentThread.ManagedThreadId); } public override void Decrement() { Count--; Console.WriteLine("-- Count={0} 线程ID={1}", Count, Thread.CurrentThread.ManagedThreadId); } } class CounterWithLock : CounterBase { private readonly object _syncRoot = new Object(); public int Count { get; private set; } public override void Increment() { lock (_syncRoot) { Count++; Console.WriteLine("++ Count={0} 线程ID={1}", Count, Thread.CurrentThread.ManagedThreadId); } } public override void Decrement() { lock (_syncRoot) { Count--; Console.WriteLine("-- Count={0} 线程ID={1}", Count, Thread.CurrentThread.ManagedThreadId); } } } abstract class CounterBase { public abstract void Increment(); public abstract void Decrement(); } }

分类:
[2] DotNet技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人