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

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

  1. C#并发编程之异步编程2

    C#并发编程之异步编程(二)   写在前面 前面一篇文章介绍了异步编程的基本内容,同时也简要说明了async和await的一些用法.本篇文章将对async和await这两个关键字进行深入探讨,研究其中 ...

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

    使用任务并行库执行异步任务 下面的示例演示如何通过调用 TaskFactory.StartNew 方法来创建并使用 Task 对象. using System; using System.Thread ...

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

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

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

     什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurre ...

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

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

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

    完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...

  7. 串行&并行&并发,同步&异步

    1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...

  8. 操作系统的发展史(并发与并行)<异步与同步>《进程与程序》[非堵塞与堵塞]

    目录 一:一:手工操作 -- 穿孔卡片 1.简介 二:手工操作方式两个特点: 三:批处理 -- 磁带存储 1.联机批处理系统 2.脱机批处理系统 3.多道程序系统 4.多道批处理系统 四:总结发展史 ...

  9. C#并发编程-2 异步编程基础-Task

    一 异步延迟 在异步方法中,如果需要让程序延迟等待一会后,继续往下执行,应使用Task.Delay()方法. //创建一个在指定的毫秒数后完成的任务. public static Task Delay ...

随机推荐

  1. C++引用和const引用、常量指针、指针常量

    1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是ob ...

  2. <转>jmeter(十九)HTTP属性管理器

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  3. canutils上板测试问题记录

    ltp-ddt运行can_loopback时出错 pan(1881): Must supply a file collection or a command 原因runtest/ddt/can_loo ...

  4. tp剩余未验证内容-8

    模型类的自动验证? 分为自动验证, 和 动态验证(手工验证), 前者的验证规则是定义在模型类中的, 所以要自己创建 扩展的/继承的模型类, 同时用 D方法实例化模型类 而动态验证是 先调用 valid ...

  5. java中Map集合的常用方法

    Map集合和Collection集合的区别 Map集合是有Key和Value的,Collection集合是只有Value. Collection集合底层也是有Key和Value,只是隐藏起来. V p ...

  6. 【虚拟机】解决网络适配器没有 VirtualBox Host-Only Ethernet Adapter 问题

    下面以windows系统来演示重新安装 VirtualBox Host-Only Ethernet Adapter的方法 1.“win+r”输入“devmgmt.msc”,出现如下界面: 2.点击菜单 ...

  7. Android 回退键监听

    回退键(back)监听:方法1:回调方法onBackPressed String LOG_TAG="TAG";  @Override    public void onBackPr ...

  8. http与rfc

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接 ...

  9. Python下探究随机数的产生原理和算法

    资源下载 #本文PDF版下载 Python下探究随机数的产生原理和算法(或者单击我博客园右上角的github小标,找到lab102的W7目录下即可) #本文代码下载 几种随机数算法集合(和下文出现过的 ...

  10. Linux虚拟机的三种网络连接方式

    Linux虚拟机的三种网络连接方式 虚拟机网络模式 无论是vmware,virtual box,virtual pc等虚拟机软件,一般来说,虚拟机有三种网络模式: 1.桥接 2.NAT 3.Host- ...