queueuserworkitemqueueuserworkitem 线程池异步任务为什么没有被立即执行

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

C# ThreadPool和Thread多线程 问

/ / 线程池示例   using System;   using System.Threading;   public class Test   {   // 存放要计算的数值的字段   static double number1 = -1;   static double number2 = -1;   public static void Main()   {   // 获取线程池的最大线程数和维护的最小空闲线程数   int maxThreadNum, portThreadNum;   int minThreadNum;   ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);   ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);   Console.WriteLine("最大线程数:", maxThreadNum);   Console.WriteLine("最小空闲线程数:", minThreadNum);   // 函数变量值   int x = 15600;   // 启动第一个任务:计算x的8次方   Console.WriteLine("启动第一个任务:计算的8次方。

", x);   ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);   // 启动第二个任务:计算x的8次方根   Console.WriteLine("启动第二个任务:计算的8次方根。

", x);   ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);   // 等待,直到两个数值都完成计算   while (number1 == -1 || number2 == -1) ;   // 打印计算结果   Console.WriteLine("y() = ", x, number1 + number2);   }   // 启动第一个任务:计算x的8次方   static void TaskProc1(object o)   {   number1 = Math.Pow(Convert.ToDouble(o), 8);   }   // 启动第二个任务:计算x的8次方根   static void TaskProc2(object o)   {   number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);   }   }

回调函数 与 线程 有何区别

普通函数与回调函数的区别:
  • 对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。

    从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”
  • 对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。

    这样,调用程序执和被调用函数同时在执行。

    当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。

    这个过程称为回调(Callback),这正是回调函数名称的由来。

    如何创建Worker线程

    创建Worker线程首先定义一个线程函数,然后调用AfxBeginThread函数。

    AfxBeginThread函数的定义如下: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize= 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL); 其中: pfnThreadProc:线程函数。

    pParam:传递给线程函数的参数。

    nPriority:线程的优先级。

    默认值为THREAD_PRIORITY_NORMAL。

    nStackSize:线程的堆栈大小。

    默认值为0。

    dwCreateFlags:线程的创建标志。

    默认值为0,表示线程产生后立即执行。

    如果其值为CREATE_SUSPENDED表示线程产生后暂停执行,直到CWinThread::ResumeThread函数被调用。

    lpSecurityAttrs:表示线程的安全属性。

    默认值为NULL。

      函数返回值是一个指向新创建线程对象的指针。

      在MFC的THRDCORE.CPP中,AfxBeginThread函数的相关代码如下: // THRDCORE.CPP CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs) { ASSERT(pfnThreadProc != NULL); CWinThread* pThread = DEBUG_NEW CWinThread( pfnThreadProc, pParam); ASSERT_VALID(pThread); if (!pThread->CreateThread( dwCreateFlags|CREATE_SUSPENDED, nStackSize, lpSecurityAttrs)) { pThread->Delete();    return NULL;    } VERIFY(pThread->SetThreadPriority(nPriority)); if (!(dwCreateFlags & CREATE_SUSPENDED)) VERIFY(pThread->ResumeThread() != (DWORD)-1); return pThread; } 从MFC代码中可以看出,AfxBeginThread函数首先创建CWinThread对象,然后调用CWinThread::CreateThread函数。

    CWinThread::CreateThread函数调用_beginthreadex函数创建线程。

    此外,AfxBeginThread和CWinThread::CreateThread还做了一些应用程序框架所需的内部数据的初始化工作。

    在MFC的AFXWIN.H中定义了线程函数类型AFX_THREADPROC: typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID); 从定义中可以看出,线程函数返回一个UINT值。

    此外,线程函数传递一个LPVOID参数,一般在使用中指向用户自定义的数据结构。

    线程函数是由系统调用的,是一个callback函数,所以必须是个全局函数或者是C++类static成员函数,而不能是C++类成员函数。

    (1)创建1个基于对话框的应用程序,名称为Demo。

    (2)在IDD_DEMO_DIALOG对话框资源中添加控件,如表所示。

    类型 ID 标题 Static IDC_STATIC 数据: Edit IDC_DATA Button IDC_BEGIN_THREAD 启动线程 (3)在文件中定义线程传递参数的数据结构,代码如下: // DemoDlg.h typedef struct THREAD_PARAM { HWND hWnd; int nData; }_THREAD_PARAM; (4)在CDemoDlg类中添加成员变量,代码如下: // DemoDlg.h protected: THREAD_PARAM m_ThreadParam; (5)在CDemoDlg类的构造函数和析构函数中添加如下代码: // DemoDlg.cpp CDemoDlg::CDemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CDemoDlg::IDD, pParent) { // ... m_ThreadParam.nData = 0; } (6)在CDemoDlg类的OnInitDialog函数中添加如下代码: // DemoDlg.cpp BOOL CDemoDlg::OnInitDialog() { CDialog::OnInitDialog(); // … SetDlgItemInt(IDC_DATA, m_ThreadParam.nData); return TRUE; } (7)在文件中定义线程消息,代码如下: // DemoDlg.h #define WM_THREADMSG WM_USER+1 (8)在文件中定义线程函数,代码如下: // DemoDlg.h UINT ThreadProc(LPVOID pParam); // DemoDlg.cpp UINT ThreadProc(LPVOID pParam) { //线程参数 THREAD_PARAM* pThreadParam = (THREAD_PARAM*)pParam; for (int n = 0; n < 10; n++) { Sleep(100); pThreadParam->nData++; //向主线程窗口发送消息 ::PostMessage(pThreadParam->hWnd, WM_THREADMSG, 0, 0); } return 0; } (9)在CDemoDlg类中为Button控件添加BN_CLICKED添加消息处理函数,代码如下: // DemoDlg.cpp void CDemoDlg::OnBeginThread() { m_ThreadParam.hWnd = m_hWnd; //启动线程 AfxBeginThread(ThreadProc, &m_ThreadParam); } (10)在CDemoDlg类中添加自定义消息处理函数,代码如下: // DemoDlg.h afx_msg LRESULT OnMsgFunc(); // DemoDlg.cpp BEGIN_MESSAGE_MAP(CDemoDlg, CDialog) ON_MESSAGE(WM_THREADMSG, OnMsgFunc) END_MESSAGE_MAP() LRESULT CDemoDlg::OnMsgFunc() { SetDlgItemInt(IDC_DATA, m_ThreadParam.nData); return 1; }

    queueuserworkitem 线程池异步任务为什么没有被立即执行

    那你其他的线程不要独占CPU,在必要的地方添加语句sleep(10)休眠下,就可以释放CPU给其他线程了,你所创建的线程就可以及时执行了。

  • 弘速云香港VPSVPS线路有CN2+BGP、CN2 GIA,KVM虚拟化架构,裸金属月付564元

    弘速云怎么样?弘速云是创建于2021年的品牌,运营该品牌的公司HOSU LIMITED(中文名称弘速科技有限公司)公司成立于2021年国内公司注册于2019年。HOSU LIMITED主要从事出售香港vps、美国VPS、香港独立服务器、香港站群服务器等,目前在售VPS线路有CN2+BGP、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。可联系商家代安装iso系统。点击进入:弘速云官方网站地址...

    青果云(590元/年),美国vps洛杉矶CN2 GIA主机测评 1核1G 10M

    青果网络QG.NET定位为高效多云管理服务商,已拥有工信部颁发的全网云计算/CDN/IDC/ISP/IP-VPN等多项资质,是CNNIC/APNIC联盟的成员之一,2019年荣获国家高薪技术企业、福建省省级高新技术企业双项荣誉。那么青果网络作为国内主流的IDC厂商之一,那么其旗下美国洛杉矶CN2 GIA线路云服务器到底怎么样?官方网站:https://www.qg.net/CPU内存系统盘流量宽带...

    BGPTO独服折优惠- 日本独服65折 新加坡独服75折

    BGPTO是一家成立于2017年的国人主机商,从商家背景上是国内的K总和有其他投资者共同创办的商家,主营是独立服务器业务。数据中心包括美国洛杉矶Cera、新加坡、日本大阪和香港数据中心的服务器。商家对所销售服务器产品拥有自主硬件和IP资源,支持Linux和Windows。这个月,有看到商家BGPTO日本和新加坡机房独服正进行优惠促销,折扣最低65折。第一、商家机房优惠券码这次商家的活动机房是新加坡...

    queueuserworkitem为你推荐
    缓冲区溢出教程哪里可以下载黑客教程,详细网址,伪静态如何设置伪静态规则伪静态什么是伪静态网站?伪静态网站有什么优势照片转手绘怎么把图片P成手绘安卓应用平台有没有什么安卓游戏都能找到的应用商店或者游戏中心9flash在“属性”对话框中的“Move”后面的框中输入Flash动画文件的绝对路径及文件名,这句话怎么操作?网店推广网站可以介绍几个可以做店铺推广的网站吗?ios7固件下载iOS7如何升级固件?宕机人们说的宕机是什么意思二层交换机什么是三层交换机?什么是二层叫交换机?有什么区别?
    美国vps租用 budgetvm 美国独立服务器 mediafire下载 免费ftp空间申请 灵动鬼影 ca4249 40g硬盘 789电视 北京双线 银盘服务 华为云服务登录 万网空间管理 免费的域名 西安主机 测试网速命令 江苏徐州移动 黑科云 睿云 免费赚q币 更多