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. js 数组的length(javascript教程四)

    这是一个简单的函数,就是利用length来判断数组再遍历数组了. <script language="javascript" type="text/javascri ...

  2. OSPF_Network-type

    OSPF的网络类型 目录 OSPF的网络类型... 1 总实验拓扑如下... 2 Router模拟帧中继交换机(所有网路为星型)... 2 配置映射... 3 广播模式下的OSPF. 4 非广播模式下 ...

  3. 64位系统下注册32位dll文件

    64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...

  4. 利用 Google API 调用谷歌地图 演示1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 了解常见的开源协议(BSD, GPL, LGPL,MIT)

    一直对各种开源协议比较模糊, 特意在网上搜索了一下资料, 整理总结,以作记录 如果不喜欢长篇大论的话, 看下图就可以了 基本概念了解: 1. Contributors 和 Recipients Con ...

  6. eclipse中tomcat配置(待完善)

    tomcat版本:apache-tomcat-6.0.29 项目结构:     一.新建server方式 二.eclipse tomcat plugin方式   tomcat plugin方式必须保证 ...

  7. zz linux 下查看局域网内所有存活主机和MAC进址

    用namp对局域网扫描一遍,然后查看arp缓存表就可以知道局域内ip-mac的对应了namp比较强大也可以直接扫描mac地址和端口 进行ping扫描,打印出对扫描做出响应的主机: nmap -sP 1 ...

  8. QT 信号与槽连接

    转帖 http://www.cnblogs.com/cnhome/archive/2009/10/01/1577277.html 信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分.这个机制 ...

  9. oracle连接和执行流程总结

    参考关于oracle连接及一个事务的完整流程分析的资料,做整理如下 参考资料: http://blog.csdn.net/wyzxg/archive/2010/08/16/5815335.aspx h ...

  10. 记录sublime text2的技巧

    好吧,其实俺是sublime text控,用了那么的编辑器,从最初的notepad++,后来到Dreawaver,现在只钟情于sublime text2....记录一些比较实用的技巧和网站吧!! 方便 ...