.NET并行计算和并发8-QueueUserWorkItem异步

 

QueueUserWorkItem方法将非常简单的任务排入队列

下面这个简单的代码,涉及到资源竞争问题,如果主线程先争取到资源,如果没有等待

一段时间,那么QueueUserWorkItem申请的线程没有机会执行。

  1     using System;
  2     using System.Threading;
  3
  4 public static void Main()
  5     {
  6         // Queue the task.
  7         ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
  8
  9         Console.WriteLine("Main thread does some work, then sleeps.");
 10         // If you comment out the Sleep, the main thread exits before
 11         // the thread pool task runs.  The thread pool uses background
 12         // threads, which do not keep the application running.  (This
 13         // is a simple example of a race condition.)
 14         Thread.Sleep(1000);
 15
 16         Console.WriteLine("Main thread exits.");
 17     }
 18
 19     // This thread procedure performs the task.
 20     static void ThreadProc(Object stateInfo)
 21     {
 22         // No state object was passed to QueueUserWorkItem, so
 23         // stateInfo is null.
 24         Console.WriteLine("Hello from the thread pool.");
 25     }
 26 

下面的代码示例使用 QueueUserWorkItem 方法将任务排入队列,并为该任务提供数据。

  1 using System;
  2 using System.Threading;
  3
  4 // TaskInfo holds state information for a task that will be
  5 // executed by a ThreadPool thread.
  6 public class TaskInfo
  7 {
  8     // State information for the task.  These members
  9     // can be implemented as read-only properties, read/write
 10     // properties with validation, and so on, as required.
 11     public string Boilerplate;
 12     public int Value;
 13
 14     // Public constructor provides an easy way to supply all
 15     // the information needed for the task.
 16     public TaskInfo(string text, int number)
 17     {
 18         Boilerplate = text;
 19         Value = number;
 20     }
 21 }
 22
 23 public class Example
 24 {
 25     public static void Main()
 26     {
 27         // Create an object containing the information needed
 28         // for the task.
 29         TaskInfo ti = new TaskInfo("This report displays the number {0}.", 42);
 30
 31         // Queue the task and data.
 32         if (ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ti))
 33         {
 34             Console.WriteLine("Main thread does some work, then sleeps.");
 35
 36             // If you comment out the Sleep, the main thread exits before
 37             // the ThreadPool task has a chance to run.  ThreadPool uses
 38             // background threads, which do not keep the application
 39             // running.  (This is a simple example of a race condition.)
 40             Thread.Sleep(1000);
 41
 42             Console.WriteLine("Main thread exits.");
 43         }
 44         else
 45         {
 46             Console.WriteLine("Unable to queue ThreadPool request.");
 47         }
 48     }
 49
 50     // The thread procedure performs the independent task, in this case
 51     // formatting and printing a very simple report.
 52     //
 53     static void ThreadProc(Object stateInfo)
 54     {
 55         TaskInfo ti = (TaskInfo)stateInfo;
 56         Console.WriteLine(ti.Boilerplate, ti.Value);
 57     }
 58 }
 59 

使用 RegisterWaitForSingleObject

下面的示例展示多种线程处理功能。

注意:
在Main方法的最后有一句:

If you start a thread yourself, you can wait for it to end by calling Thread.Join.  This option is not available with thread pool threads.

  1 using System;
  2 using System.Threading;
  3
  4 // TaskInfo contains data that will be passed to the callback
  5 // method.
  6 public class TaskInfo
  7 {
  8     public RegisteredWaitHandle Handle = null;
  9     public string OtherInfo = "default";
 10 }
 11
 12 public class Example
 13 {
 14     public static void Main(string[] args)
 15     {
 16         // The main thread uses AutoResetEvent to signal the
 17         // registered wait handle, which executes the callback
 18         // method.
 19         AutoResetEvent ev = new AutoResetEvent(false);
 20
 21         TaskInfo ti = new TaskInfo();
 22         ti.OtherInfo = "First task";
 23         // The TaskInfo for the task includes the registered wait
 24         // handle returned by RegisterWaitForSingleObject.  This
 25         // allows the wait to be terminated when the object has
 26         // been signaled once (see WaitProc).
 27         ti.Handle = ThreadPool.RegisterWaitForSingleObject(
 28             ev,
 29             new WaitOrTimerCallback(WaitProc),
 30             ti,
 31             1000,
 32             false);
 33
 34         // The main thread waits three seconds, to demonstrate the
 35         // time-outs on the queued thread, and then signals.
 36         Thread.Sleep(3100);
 37         Console.WriteLine("Main thread signals.");
 38         ev.Set();
 39
 40         // The main thread sleeps, which should give the callback
 41         // method time to execute.  If you comment out this line, the
 42         // program usually ends before the ThreadPool thread can execute.
 43         Thread.Sleep(1000);
 44         // If you start a thread yourself, you can wait for it to end
 45         // by calling Thread.Join.  This option is not available with
 46         // thread pool threads.
 47     }
 48
 49     // The callback method executes when the registered wait times out,
 50     // or when the WaitHandle (in this case AutoResetEvent) is signaled.
 51     // WaitProc unregisters the WaitHandle the first time the event is
 52     // signaled.
 53     public static void WaitProc(object state, bool timedOut)
 54     {
 55         // The state object must be cast to the correct type, because the
 56         // signature of the WaitOrTimerCallback delegate specifies type
 57         // Object.
 58         TaskInfo ti = (TaskInfo)state;
 59
 60         string cause = "TIMED OUT";
 61         if (!timedOut)
 62         {
 63             cause = "SIGNALED";
 64             // If the callback method executes because the WaitHandle is
 65             // signaled, stop future execution of the callback method
 66             // by unregistering the WaitHandle.
 67             if (ti.Handle != null)
 68                 ti.Handle.Unregister(null);
 69         }
 70
 71         Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.",
 72             ti.OtherInfo,
 73             Thread.CurrentThread.GetHashCode().ToString(),
 74             cause
 75         );
 76     }
 77 }
 78 

时间: 2024-10-07 08:13:59

.NET并行计算和并发8-QueueUserWorkItem异步的相关文章

并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁

# 并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁 # 并发:是指系统具有处理多个任务(动作)的能力 # 并行:是指系统具有 同时 处理多个任务(动作)的能力 # 同步:当进程执行到一个IO(等待外部数据)的时候,需要等待外部数据接收完 # 异步:当进程执行到一个IO(等待外部数据)的时候,不需要等待外部数据接收完,还可以做其它的处理 # GIL: 全局解释器锁 在python中,无论你启多少个线程,你有多少个cpu,python在执行的时候在同一时刻只请允许一个线程运行 #

.NET并行计算和并发7-Task异步

使用任务并行库执行异步任务 下面的示例演示如何通过调用 TaskFactory.StartNew 方法来创建并使用 Task 对象. 1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 class Example 6 { 7 static void Main() 8 { 9 Action<object> action = (object obj) => 10 { 11 Console.

.net高并发应用实现,异步单线程非堵塞解决方案

GGKServer 框架,基于C#.NET(4.0)开发,主要调用库API.DLL 是.Net用一种新的方式开发web应用,实现万人级应用. GGKServer 对静态能容采用强制gzip压缩,强制缓存(智能释放缓存). GGKServer 主要实现方式使用 SocketAsyncEventArgs 异步对象池进行异步单线程非堵塞socket服务,类似IOCP. GGKServer 启动时会根据站点设置的最大队列初始化一个处理对象的队列池,收到请求Pop一个对象进行处理,完成后Push回池中.

并发 并行 同步 异步 多线程的区别

1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥.3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系.进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待.具有同步关系的一组并发进程相互发送的信息称为消息或事件.其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并

如何提高Web服务端并发效率的异步编程技术

作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升web应用服务端的并发能力.那么我们如何做到这点了,根据现有的并发技术我们会有如下选择: 第一个做法:为每个客户端发送给服务端的请求都开启一个线程,等请求处理完毕后该线程就被销毁掉,这种做法很直观,但是在现代的web服务器里这种做法已经很少使用了,原因是新建一个线程,销毁一个线程的开销(开销是指占用

并发 并行 同步 异步 多线程的区别 (转)

1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥 2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥. 3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系.进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待.具有同步关系的一组并发进程相互发送的信息称为消息或事件. 其中并发又有伪并发和真并发,伪并发是指单核处理器的并发

浅入了解GCD 并发 并行 同步 异步 多线程

 什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurrency vs Parallelism  单核设备:先运行一个线程,执行一个上下文切换.这通常切换很快以致给我们有并发执行地错觉.也就是说在一秒钟内吃了饭也拉了屎,可是每半秒中只能做一件事情(吃饭或拉屎)但是给人的感觉好像是同时进行的.这是单核逻辑模拟出两个线程的假象如下图Concurrency所示:

并发 并行 同步 异步 多线程 阻塞 非阻塞的区别

1. 并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥. 同步(synchronous):进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系.进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待.具有同步关系的一组并发进程相互发送的信息称为消息或事件. 其中并发又有伪

理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,