利用多线程,执行有返回值的方法
解决的问题:
1. 当需要拿到多线程执行的方法的结果
2. 如何让主线程,等在所有的子线程直接结束
class Program { static void Main(string[] args) { IList<ManualResetEvent> listManual = new List<ManualResetEvent>(); List<ThreadReturnData> testList = new List<ThreadReturnData>(); for (int i = 0; i < 10; i++) { ThreadReturnData temp = new ThreadReturnData(); temp.manual = new ManualResetEvent(false); temp.parm = "test"; listManual.Add(temp.manual); testList.Add(temp); ThreadPool.QueueUserWorkItem(new WaitCallback(temp.ReturnThreadData), i); } //等待本次查询线程全部执行完毕 if (listManual.Count > 0) { WaitHandle.WaitAll(listManual.ToArray()); } foreach (var item in testList) { Console.WriteLine(item.result); //异步的结果 } } public class ThreadReturnData { public ManualResetEvent manual; public string parm; public string result; public void ReturnThreadData(object info) { result = parm + info.ToString(); manual.Set(); } }
在给子线程需要执行的方法传递参数的时候,可以用两种方法,一种给该方法直接传个参数例如上面的“i",还有一种方法就是,对于子线程需要执行的ReturnThreadData方法所在的实例temp设置一个属性(parm),在需要执行方法钱给该属性赋值( temp.parm = "test"),那么在方法中可以直接调用本实例的属性。如何或者子线程执行的结果呢,原理更给参数赋值的第二种方式原理一样,在方法所在的类ThreadReturnData中设置一个结果属性(result),在方法执行完后把结果直接赋值给result,那么在主线程的temp实例中就可以获取到执行的结果result。那么为什么主线程和子线程都能访问到temp实例呢,temp实例实在主线程中创建的,在传给子线程需要执行的WaitCallBack委托的时候,是把temp实例的ReturnThreadData传递给了该委托。但同时也会ReturnThreadData实例方法所在的实例也传给委托(有个隐含的this参数就是temp实例),所以在执行委托方法时候可以直接引用到方法所在实例的属性。本质上也就是引用类型的传递,只要引用类型的数据在某处引用的地方发生变化,那么在所以其他引用了这个引用类型的地方都可以获取到这个变化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具