zoukankan      html  css  js  c++  java
  • 利用多线程,执行有返回值的方法

    解决的问题:

          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实例),所以在执行委托方法时候可以直接引用到方法所在实例的属性。本质上也就是引用类型的传递,只要引用类型的数据在某处引用的地方发生变化,那么在所以其他引用了这个引用类型的地方都可以获取到这个变化。

  • 相关阅读:
    监控注册表和文件夹改动
    Windows中根据GetLastError的错误代码,取得文字描述
    VBA 读取文件/写入文件
    (转)ansi,gb2312,gbk,gb18030,unicode,utf8,unicode big endian编码的区别及什么是BOM
    VBA 打开文件对话框
    修改GitHub记录中的invalidemailaddress
    使用DWM实现Aero Glass效果
    RAII(C++必知必会 条款40)
    C函数包装ASM代码时,指针无法传值的问题
    msysgit color.ui auto is invalid msysgit无法开启彩色显示
  • 原文地址:https://www.cnblogs.com/xinxinzhihuo/p/7390832.html
Copyright © 2011-2022 走看看