queueuserworkitem为什么在Ubuntu上用c开线程后不执行回调函数

queueuserworkitem  时间:2021-01-17  阅读:()

怎么判断ThreadPool线程池里的任务都执行完毕

c# ThreadPool 判断子线程全部执行完毕的四种方法 1、先来看看这个 多线程编程 多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可。

using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { ThreadPool.SetMaxThreads(3, 3); //设置最大线程数 for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法 } Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } public static void Auto(object i)//多线程执行的方法 { if (string.Equals(i,2)) { Thread.Sleep(2000); } Console.WriteLine(i.ToString()); } } } 明白吧,就是多线程执行顺序是不确定的。

2、再来看看这个结果 static void Main(string[] args) { try { ThreadPool.SetMaxThreads(3, 3); //设置最大线程数 for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法 } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("结束了"); //这句要改 Console.ReadLine(); } public static void Auto(object i)//多线程执行的方法 { if (string.Equals(i, 2)) { Thread.Sleep(2000); } Console.WriteLine(i.ToString()); } 结束了 这三个字不一定 真正在 最后一行输出。

因为这时是 主线程+子线程 这些线程的执行顺序不确定,可能主线程老早就执行了。

也就说可能结束了 这三个字很早就会输出。

3、主题 保证 结束了 在最后输出。

方法1: //这是主线程,一直都会执行。

目前一直在进行的是 一个主线程+多个子线程 while (true) { Thread.Sleep(1000);//这句写着,主要是没必要循环那么多次。

去掉也可以。

int maxWorkerThreads, workerThreads; int portThreads; ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads); ThreadPool.GetAvailableThreads(out workerThreads, out portThreads); if (maxWorkerThreads - workerThreads == 0) { Console.WriteLine("结束了"); break; } } GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。

而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。

通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。

方法2 : Monitor 见下篇文章:/handboy/blog/item/681d093875d6e6cdd56225ae.html class Program { static object locker = new object(); static int runningThreads = 0; static void Main(string[] args) { try { ThreadPool.SetMaxThreads(4, 4); //设置最大线程数 using System.Threading; runningThreads = 10; for (int i = 0; i < runningThreads; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法 } } catch (Exception ex) { Console.WriteLine(ex.Message); } lock (locker) { while (runningThreads > 0) { Monitor.Wait(locker); } } Console.WriteLine("结束了"); Console.ReadLine(); } public static void Auto(object i)//多线程执行的方法 { if (string.Equals(i, 2)) { Thread.Sleep(2000); } lock (locker) { runningThreads--; Monitor.Pulse(locker); } Console.WriteLine(i.ToString()); } } 方法3:WaitHandle (推荐用这个方法) 。

/ganggang0217/blog/item/fe2a004ecad3acdcd0c86a67.html public void testThreads() { ManualResetEvent[] _ManualEvents = new ManualResetEvent[10]; for (int i = 0; i < 10; i++) { _ManualEvents[i] = new ManualResetEvent(false); System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(testMethod), _ManualEvents[i]); } WaitHandle.WaitAll(_ManualEvents); // 线程结束后执行后面的主线程代码 Console.WriteLine("结束了"); Console.ReadLine(); } public void testMethod(object objEvent) { //TODO: Add your code here ManualResetEvent e = (ManualResetEvent)objEvent; e.Set(); }

为什么在Ubuntu上用c开线程后不执行回调函数

可以通过线程池ThreadPool来解决,使用ThreadPool.QueueUserWorkItem(回调函数,object),将参数封装在一个类的对象中,传给回调函数去执行。

TheadPool的用法: 1、创建一个ManualResetEvent的对象,就像一个信号灯,指示线程的挂起和执行; 2、ManualResetEvent对象创建时,可以指定默认状态:true为有信号,false为无信号; 3、调用Reset()方法重置状态; 4、调用WaitOne()方法,使线程处于等待状态; 5、调用Set()方法设置状态。

using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Collections; namespace Demo { public class ParamObject { public int number; public ParamObject (int number) { this.number = number; } } public class ThreadClass { public Hashtable aHashTable; public ManualResetEvent aManualResetEvent; public static int iCount = 0; public static int iMaxCount = 0; public ThreadClass(int maxCount) { aHashTable = new Hashtable(maxCount); iMaxCount = maxCount; } public void ThreadRun(object aParamObject) { Console.WriteLine("HashCode: {0}, Number in Object: {1}", Thread.CurrentThread.GetHashCode(), ((ParamObject)aParamObject).number); lock (aHashTable) { if (!aHashTable.ContainsKey(Thread.CurrentThread.GetHashCode())) { aHashTable.Add(Thread.CurrentThread.GetHashCode(), 0); } aHashTable[Thread.CurrentThread.GetHashCode()] = (int)aHashTable[Thread.CurrentThread.GetHashCode()] + 1; } Thread.Sleep(3000); Interlocked.Increment(ref iCount); if (iCount == iMaxCount) { Console.WriteLine("Setting aManualResetEvent..."); aManualResetEvent.Set(); } } } class Program { public static void Main(string[] args) { bool enableThreadPool = false; int iMaxCount = 20; ManualResetEvent aManualResetEvent = new ManualResetEvent(false); Console.WriteLine("Insert {0} items to Thread Pool.", iMaxCount); ThreadClass aThreadClass = new ThreadClass(iMaxCount); aThreadClass.aManualResetEvent = aManualResetEvent; // First, add an item to check if your system supports ThreadPool API function or not. try { ThreadPool.QueueUserWorkItem(new WaitCallback(aThreadClass.ThreadRun), new ParamObject(0)); enableThreadPool = true; } catch (NotSupportedException ex) { Console.WriteLine("Thread Pool API is not supported in this system."); enableThreadPool = false; } if (enableThreadPool) { for (int i = 1; i < iMaxCount; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(aThreadClass.ThreadRun), new ParamObject(i)); } Console.WriteLine("Waiting for thread pool to drain"); aManualResetEvent.WaitOne(Timeout.Infinite, true); Console.WriteLine("Thread Pool has been drained."); Console.WriteLine("Load threads info:"); foreach (object key in aThreadClass.aHashTable.Keys) { Console.WriteLine("Key: {0}, Value: {1}", key, aThreadClass.aHashTable[key]); } } Console.ReadLine(); } } }

EtherNetservers年付仅10美元,美国洛杉矶VPS/1核512M内存10GB硬盘1Gpbs端口月流量500GB/2个IP

EtherNetservers是一家成立于2013年的英国主机商,提供基于OpenVZ和KVM架构的VPS,数据中心包括美国洛杉矶、新泽西和杰克逊维尔,商家支持使用PayPal、支付宝等付款方式,提供 60 天退款保证,这在IDC行业来说很少见,也可见商家对自家产品很有信心。有需要便宜VPS、多IP VPS的朋友可以关注一下。优惠码SUMMER-VPS-15 (终身 15% 的折扣)SUMMER-...

Tudcloud(月付7.2美元),香港VPS,可选大带宽或不限流量

Tudcloud是一家新开的主机商,提供VPS和独立服务器租用,数据中心在中国香港(VPS和独立服务器)和美国洛杉矶(独立服务器),商家VPS基于KVM架构,开设在香港机房,可以选择限制流量大带宽或者限制带宽不限流量套餐。目前提供8折优惠码,优惠后最低每月7.2美元起。虽然主机商网站为英文界面,但是支付方式仅支付宝和Stripe,可能是国人商家。下面列出部分VPS主机套餐配置信息。CPU:1cor...

域名注册需要哪些条件(新手注册域名考虑的问题)

今天下午遇到一个网友聊到他昨天新注册的一个域名,今天在去使用的时候发现域名居然不见。开始怀疑他昨天是否付款扣费,以及是否有实名认证过,毕竟我们在国内域名注册平台注册域名是需要实名认证的,大概3-5天内如果不验证那是不可以使用的。但是如果注册完毕的域名找不到那也是奇怪。同时我也有怀疑他是不是忘记记错账户。毕竟我们有很多朋友在某个商家注册很多账户,有时候自己都忘记是用哪个账户的。但是我们去找账户也不办...

queueuserworkitem为你推荐
易pc华硕易PC这款本本值不值的买勒?简体翻译成繁体简体字怎么换成繁体。。?ps抠图技巧ps的抠图技巧是什么办公协同软件协同企业办公的软件有哪些?童之磊华硕的四核平板电脑,怎么样?腾讯文章怎样才能在手机腾讯网上发表文章?人人逛街人人逛街评论怎么不显示链接了?好像4月28日就不能显示了。是什么原因呢?安装迅雷看看播放器如何用手机安装迅雷看看播放器bt封杀BT下载可以封杀迅雷吗?什么原理?能破吗?iphone6上市时间苹果6什么时候在中国大陆上市
新加坡主机 42u标准机柜尺寸 私有云存储 100m免费空间 京东商城0元抢购 qingyun 个人域名 cdn联盟 免费测手机号 流媒体加速 512mb 重庆电信服务器托管 下载速度测试 cxz 主机管理系统 西安主机 徐州电信 免费网络空间 服务器托管价格 湖南铁通 更多