• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#线程池ThreadPool.QueueUserWorkItem接收线程执行的方法返回值

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  最近在项目中需要用到多线程,考虑了一番,选择了ThreadPool,我的需求是要拿到线程执行方法的返回值,

但是ThreadPool.QueueUserWorkItem的回调方法默认是没有返回值的,搜了搜,都是简单介绍ThreadPool.QueueUserWorkItem的各种

用法,只能自己想办法了。

  回调方法不带返回值,迂回一下,回调方法用对象的方法,返回值放在对象的属性中,在对象方法执行时将需要的返回值赋值给对应属性。

等所有线程执行完,循环对象列表,取回返回值,然后想怎么处理返回值就OK了。上代码: 

  封装对象:

 1 using System;
 2 using System.Threading;
 3  public class ThreadReturnData
 4     {
 5         public ManualResetEvent manual;
 6         public string res;
 7 
 8         public void ReturnThreadData(object obj)
 9         {
10             //线程耗时操作方法
11             res = DoSomething(obj);
12              manual.Set();
13         }
14     }

  多线程调用:

 1  List<ThreadReturnData> testList = new List<ThreadReturnData>();
 2 IList<ManualResetEvent> arrManual = new List<ManualResetEvent>();
 3 for (int i = 0; i < i; i++)
 4                     {
 5                             ThreadReturnData temp = new ThreadReturnData();
 6                             temp.manual = new ManualResetEvent(false);
 7                             arrManual.Add(temp.manual);
 8                             ThreadPool.QueueUserWorkItem(new WaitCallback(temp.ReturnThreadData), i);
 9                             testList.Add(temp);
10                         }
11                     }
12                     if (arrManual.Count > 0)
13                     {
14                         ////等待所有线程执行完
15                         WaitHandle.WaitAll(arrManual.ToArray());
16                     }
17  foreach (ThreadReturnData d in testList)       
18  {
19 d.res;
20 //todo
21 }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
JSON(序列化与反序列化)[Serializable]在C#中的作用-NET中的对象序列化 ...发布时间:2022-07-13
下一篇:
C++时间复杂度发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap