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. MVC 下 使用MvcPager分页控件

    先去下载 mvcpage http://mvcpager.codeplex.com/releases/view/64098只需要一个 MvcPager.dll文件即可 然后引用MvcPager.dll ...

  2. mongodb c++ 驱动库编译

    git clone 'https://github.com/mongodb/mongo-cxx-driver.git' scons -j2 --c++11=on --sharedclient --us ...

  3. Oracle11g使用exp导出空表

    1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是 ...

  4. GCD Block

    GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...

  5. OrCAD Capture CIS与Allegro交互布局

    激活OrCAD与Allegro的交互程序 1. 打开原题图,Options->Preference在Miscellaneous里勾选 2. 同时打开OrCAD原理图设计界面及Allegro PC ...

  6. centos下redis和nginx软件的安装

    我们这章以redis和nginx软件为例,介绍一下centos下软件的安装. 需要软件包(可以先下载好复制到centos指定目录下,也可直接用wget命令获取): nginx-1.7.9.tar re ...

  7. c# WinForm 编程总结

    1.清空DataGridView /// <summary> /// 清空DataGridView /// </summary> /// <param name=&quo ...

  8. Nginx 之并发优化

    客户端/服务端 连接数 ulimit -n 100000 nginx 链接数 10240 个 worker_connections 10240;允许打开文件数worker_processes 1;wo ...

  9. PHP 图片文件上传代码

    通过 PHP,可以把文件上传到服务器.里面加入一些图片的判断,如果不加判断文件的类型就可以上传任意格式的文件. 为了网站的安全,肯定不让上传php文件,如果有人进入你的后台,上传了一个php文件,你的 ...

  10. Python-Day3 Python基础进阶之集和/文件读写/函数

    一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...