1、首先我们要实现如下图的效果:                                                         

  a、主线程A运行方法段1时创建子线程B

  b、然后子线程B执行方法段2

  c、执行完后通知主线程A执行方法段3

2、实现代码如下:

        public Form1()
{
InitializeComponent();
} public void Method1()
{
//给主线程取个名字
if (Thread.CurrentThread.Name == null)
Thread.CurrentThread.Name = "main"; //获取主线程上下文
asyncOperation = AsyncOperationManager.CreateOperation(null); //创建一个线程并执行方法2
ThreadStart ts = new ThreadStart(Method2);
Thread t = new Thread(ts);
t.Name = "work";
t.Start();
} public void Method2()
{
MessageBox.Show("当前线程:" + Thread.CurrentThread.Name); //模拟干了一件3秒耗时的事情
Thread.Sleep(); //通知主线程我事情干好了,你可以执行方法3了
if (asyncOperation != null)
asyncOperation.Post(new SendOrPostCallback(Method3), null); //结束上下文的生存期
asyncOperation.OperationCompleted();
} public void Method3(object data)
{
MessageBox.Show("当前线程:" + Thread.CurrentThread.Name);
} private AsyncOperation asyncOperation;
private void button1_Click(object sender, EventArgs e)
{
Method1();

3、要点记录

1、AsyncOperation 一般通过 AsyncOperationManager 对象获取

asyncOperation = AsyncOperationManager.CreateOperation(null);

2、在System.Windows.Forms.Form的UI线程存在对应的上下文AsyncOperation,在Conosol控制台程序的主线程不存在上下文AsyncOperation

给个例子一看就清楚了

        static AsyncOperation asyncOperation;

        static void Main(string[] args)
{
Console.WriteLine("我是主线程:" + Thread.CurrentThread.ManagedThreadId);
Method1();
Console.ReadKey();
} static void Method1()
{ //获取主线程上下文
asyncOperation = AsyncOperationManager.CreateOperation(null); //创建一个线程
ThreadStart ts = new ThreadStart(Method2);
Thread t = new Thread(ts);
t.Start();
} static void Method2()
{
Console.WriteLine("我是子线程:" + Thread.CurrentThread.ManagedThreadId); //模拟干了一件3秒耗时的事情
Thread.Sleep(); //通知主线程事情干好了,其实这里创建了一个新线程
if (asyncOperation != null)
asyncOperation.Post(new SendOrPostCallback(Method3), null); //结束上下文的生存期
asyncOperation.OperationCompleted();
} static void Method3(object data)
{
Console.WriteLine("我是上下文创建的线程:" + Thread.CurrentThread.ManagedThreadId);
}
 

多线程学习之AsyncOperation实现线程间交互的更多相关文章

  1. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  2. C++多线程编程(三)线程间通信

    多线程编程之三——线程间通讯 作者:韩耀旭 原文地址:http://www.vckbase.com/document/viewdoc/?id=1707 七.线程间通讯 一般而言,应用程序中的一个次要线 ...

  3. Java多线程学习(八)线程池与Executor 框架

    目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...

  4. Java基础教程:多线程基础(2)——线程间的通信

    Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...

  5. Java多线程编程(三)线程间通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  6. java多线程系列5-死锁与线程间通信

    这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两 ...

  7. Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)

    所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也 ...

  8. Java学习个人备忘录之线程间的通信

    线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...

  9. Adnroid 源码学习笔记:Handler 线程间通讯

    常见的使用Handler线程间通讯: 主线程: Handler handler = new Handler() { @Override public void handleMessage(Messag ...

随机推荐

  1. iOS UILable高度自适应

    适用于iOS6以后 NSString *tip = @"UILable高度自适应,UILable高度自适应,UILable高度自适应"; UILabel label_2 = [[U ...

  2. SQLSERVER中按年月分组

    SQLSERVER中按年月分组 一个表有三个字段id,dt,d  分别存放id,时间,数值  id    dt    d 1 2004-08-11 12:12:00.000 9  2 2005-09- ...

  3. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

  4. C# Winform里面用Console.WriteLine输出到哪了

    C# Winform里面用Console.WriteLine输出也不会报错 显示在 VS IDE 的视图→输出窗口,且只在 Debug 环境下此语句执行. 如果是 Release 环境,在 Win32 ...

  5. WCF之可靠性

    可靠性会话: 端到端(多个点到点系统组成)的可靠性,基于消息,基于WS-*,可以跨平台. 在信道层创建可靠性会话,由两端的缓冲区进行可靠性管理(对消息进行排序后才发给服务器端,接收到消息后回发ACK. ...

  6. js获取url及url参数的方法

    <script language="JavaScript" type="text/javascript"> function GetUrlParms ...

  7. Eclipse的常用快捷方式

    在开发中,常用的一些快捷方式 alt+shift+r 修改方法名,变量名,关键体会enter                 ctrl+shift+c 先选中n行,注释                 ...

  8. 记录一下hdu的几道题

    杭州电子科技大学程序设计竞赛 2016‘12-网络同步赛 前几天看到这个比赛,想着要是到时候没事就做一下,但是中午实在太困,加上水平太次,才a了4道题目. 说明:我是看ac人数多少的顺序来做题的. 1 ...

  9. OLE-Excel基本操作

    1.create object  obj   CREATE OBJECT EXCEL 'Excel.Application'. 这个obj通常指能够支持的应用程序 应用程序首先要满足OLE2的标准 同 ...

  10. java.util.TreeMap源码分析

    TreeMap的实现基于红黑树,排列的顺序根据key的大小,或者在创建时提供的比较器,取决于使用哪个构造器. 对于,containsKey,get,put,remove操作,保证时间复杂度为log(n ...