HANDLE hSemaphore = CreateSemaphoreW(&sa, 0 ,1, L”jyytet”); for (int i = 0; i < 10; i++) { QueueUserWorkItem (TestThreadPool, L”Hello World”, WT_EXECUTEDEFAULT); } QueueUserWorkItem(TestThreadPool, L”Finish”,
一 不带参数 ThreadPool.QueueUserWorkItem(delegate { PostDataWhenLoadData(); }); private void PostDataWhenLoadData SysnShowError(br); } } 二 带参数 string ti = “”; ThreadPool.QueueUserWorkItem
编写代码的过程中经常会遇到需要并行操作的时候,此时就需要使用到多线程操作,.net中提供了多种操作多线程的方法,这里介绍最简单的一种—-通过ThreadPool.QueueUserWorkItem。 首先看实例代码 ThreadPool.QueueUserWorkItem(DoSomeThing); private void DoSomeThing(object state) { } 其实灰常简单,上面定义了一个测试方法DoSomeThing用于模拟耗时操作,忧郁的表示正常情况应该不会有人会写出这样的方法,当需要异步调用DoSomeThing时,只需要通过调用QueueUserWorkItem cancelSource = new CancellationTokenSource(); 之后将CancellationTokenSource对象的token通过回调方法传入 ThreadPool.QueueUserWorkItem ((o) => { DoSomeThing(cancelSource.Token, o); }); 因为QueueUserWorkItem的回调函数要求只有一个参数,此处使用了lambda构建了一个含有一个参数的匿名函数
}; foreach (var action in actions) { ThreadPool.QueueUserWorkItem 当然,如果我们用for循环的话,结果就又不一样了 比如写成 for (int i = 0; i < actions.Count; i++) { ThreadPool.QueueUserWorkItem 写成 for (int i = 0; i < actions.Count-1; i++) { ThreadPool.QueueUserWorkItem(state => actions
(o => this.DoSomethingLong("参数1")); ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong("参数4")); ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong("参数8")); ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong("参数4")); ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem(o => this.DoSomethingLong("参数8")); ThreadPool.QueueUserWorkItem
ATOMDWORD *_Locked; Ex0ArgThunk _Arg0Thunk; exception_ptr *_ExceptionPtr; }; } /* QueueUserWorkItemEx QueueUserWorkItem 参数: Flags,参见 QueueUserWorkItem 的 Flags 参数。 _Func,可调用对象。 Args,传递给可调用对象的参数包。 返回值: 参见 QueueUserWorkItem。 当线程 池中所有线程均处于繁忙状态时可能导致调用线程长时间挂起,若调用线程是QueueUserWorkItem中的线程还会 导致线程池的伸缩性丧失。 Create( &_Locked, &_ExceptionPtr, std::forward< _Fn1>( _Func ), std::forward< _Types >( Args )... ); if( QueueUserWorkItem
今天在博客园拜读了 蒋金楠,难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?自己也深有启发,决定再次陈述个人理解。 //遍历输出结果 foreach (var action in actions) { ThreadPool.QueueUserWorkItem action in actions) { var Tempaction = action; ThreadPool.QueueUserWorkItem
开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用: 1: class 10: 11: foreach (var action in actions) 12: { 13: ThreadPool.QueueUserWorkItem 10: 11: foreach (var action in actions) 12: { 13: ThreadPool.QueueUserWorkItem 所以正确的写法是: 1: foreach (var action in actions) 2: { 3: var a = action; 4: ThreadPool.QueueUserWorkItem
通常情况下,应用程序中采用异步调用函数的形式来实现多任务,在windows中,系统提供了QueueUserWorkItem函数实现异步调用,这个函数相当于在线程池中建立多个用户工作项目,跟普通线程机制一样 查MSDN,可看到QueueUserWorkItem函数语法如下: BOOL WINAPI QueueUserWorkItem( __in LPTHREAD_START_ROUTINE Function WINAPI TestThreadPool3(PVOID pContext); CRITICAL_SECTION g_cs; int main(int argc, char * argv[]) { QueueUserWorkItem (TestThreadPool1, L"Hello World", WT_EXECUTEDEFAULT); QueueUserWorkItem(TestThreadPool2, L"Hello World ", WT_EXECUTEDEFAULT); QueueUserWorkItem(TestThreadPool3, L"Hello World", WT_EXECUTEDEFAULT); getchar
ThreadPool 类中拥有一个 QueueUserWorkItem 方法,该方法为静态方法。它接受一个委托,表示用户定义的异步操作。在方法被调用后,委托会进入到内部队列中。 一、异步操作 当我们需要在线程池中加入异步操作时,通过 ThreadPool.QueueUserWorkItem 方法即可实现线程池异步操作。 QueueUserWorkItem 有两个重载,分别是 QueueUserWorkItem(WaitCallback) 和 QueueUserWorkItem(WaitCallback, Object) 之后我们在 Main 方法里通过 ThreadPool.QueueUserWorkItem 方法将顾客第一次点餐的内容传入 Cooking 中。 接着我们通过 Sleep 方法来暂停 2 秒,然后我们再次通过 ThreadPool.QueueUserWorkItem 方法将顾客所加的菜传入 Cooking 方法中。
无参数传递: private void DoWork() { ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomeThing)); } } //有参数传递 private void DoWork() { ThreadPool.QueueUserWorkItem(new WaitCallBack(this.DoSomeThing), messagebox.show(o.tostring()); } //使用匿名方法更灵活 private void DoWork() { string name="guodiegang"; ThreadPool.QueueUserWorkItem 还希望在调用完后得到一个返回值: private void DoWork() { WaitCallback wc=new WaitCallback(this.DoSomeThing); ThreadPool.QueueUserWorkItem
在windows中,系统提供了QueueUserWorkItem 函数实现异步调用,这个函数相当于在线程池中建立多个用户工作项目,跟普通线程机制一样,线程池也有线程的同步等机制。 【函数原型】 BOOL WINAPI QueueUserWorkItem( __in LPTHREAD_START_ROUTINE Function, __in HANDLE hCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); InitializeCriticalSection(&g_cs); QueueUserWorkItem (Thread1, L"I'm thread 1", WT_EXECUTEINLONGTHREAD); QueueUserWorkItem(Thread2, L"I'm thread 2", WT_EXECUTEINLONGTHREAD ); QueueUserWorkItem(Thread3, L"I'm thread 3", WT_EXECUTEINLONGTHREAD); WaitForSingleObject(hCompleteEvent
= new Random(seed); ThreadPool.QueueUserWorkItem ( new WaitCallback(CalBase)); ThreadPool.QueueUserWorkItem( new WaitCallback(CalFirst)); ThreadPool.QueueUserWorkItem( new WaitCallback(CalSec)); ThreadPool.QueueUserWorkItem( new
使用线程池开启线程 ThreadPool.QueueUserWorkItem(o=>this.DoSomeThing("btnThreadPool_Click_1")); ThreadPool.QueueUserWorkItem(o => { this.DoSomeThing("btnThreadPool_Click_2"); WaitOne就能通过 //如果初始为tue--打开, mre.Rset()之后变为false,WaitOne就只能等待 ThreadPool.QueueUserWorkItem mres[i] = new ManualResetEvent(false); int k = i; ThreadPool.QueueUserWorkItem
使用QueueUserWorkItem实现对异步委托的先进先出有序的回调。如果在回调的方法里面发生异常则应用程序会出现闪退。当然是指不处理那个异常的情况下。 [SecuritySafeCritical] public static bool QueueUserWorkItem(WaitCallback callBack, object state ); } private static void Pool_Exceute(object obj) { ThreadPool.QueueUserWorkItem
下面是几种方式进入线程池: 通过Task Parallel Library(.NET 4.0) 通过调用ThreadPool.QueueUserWorkItem 通过asynchronous delegates 要使用QueueUserWorkItem,只需调用这个方法的运行在线程池上的委托。 static void Main(string[] args) { ThreadPool.QueueUserWorkItem(Go); ThreadPool.QueueUserWorkItem(Go 不像Task,QueueUserWorkItem不会返回一个对象去帮助你之后管理执行。还有,你必须显式在目标方法的代码中写处理异常的代码-因为未处理的异常将会终止程序。 ThreadPool.QueueUserWorkItem没有提供从一个已经完成的线程中得到它的返回值的机制。
QueueUserWorkItem方法用于排队一个工作项,该工作项将在线程池线程上执行。GetAvailableThreads和GetMaxThreads方法用于获取线程池的当前状态。 System;using System.Threading;class Program{ static void Main(string[] args) { ThreadPool.QueueUserWorkItem ThreadPool pool = new ThreadPool(4, 10, true); for (int i = 0; i < 20; i++) { pool.QueueUserWorkItem AutoResetEvent autoEvent = new AutoResetEvent(false); static void Main(string[] args) { ThreadPool.QueueUserWorkItem cts = new CancellationTokenSource(); CancellationToken token = cts.Token; ThreadPool.QueueUserWorkItem
HttpGet("TaskQueue")] public bool TaskQueue() { var inQueues = ThreadPool.QueueUserWorkItem { Console.WriteLine("此任务来自线程池队列执行"); } 上面的代码中,在 TaskQueue() 内部使用 ThreadPool.QueueUserWorkItem () 将方法 ThreadProc(Object stateInfo) 压入队列中,并返回一个值:inQueues ,该值指示任务压入队列是否成功,在 .Net Core 中,ThreadPool.QueueUserWorkItem HttpGet("TaskQueue")] public bool TaskQueue() { var inQueues = ThreadPool.QueueUserWorkItem (ThreadProc); var inQueuesSecond = ThreadPool.QueueUserWorkItem(ThreadProc, "这是一条测试消息");
CancellationTokenSource ctsToken = new CancellationTokenSource(); ThreadPool.QueueUserWorkItem (o => EoworkOne(ctsToken.Token)); ThreadPool.QueueUserWorkItem(o => EoworkTwo(ctsToken.Token ThreadPool.QueueUserWorkItem(o => EoworkOne(ctsToken.Token)); ThreadPool.QueueUserWorkItem(o => EoworkTwo static void Main(string[] args) { ThreadPool.QueueUserWorkItem(o => EoworkOne(CancellationToken.None
设置最大线程数 for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem for (int i = 0; i < runningThreads; i++) { ThreadPool.QueueUserWorkItem int i = 0; i < 10; i++) { _ManualEvents[i] = new ManualResetEvent(false); System.Threading.ThreadPool.QueueUserWorkItem