多线程学习之AsyncOperation实现线程间交互
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实现线程间交互的更多相关文章
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- C++多线程编程(三)线程间通信
多线程编程之三——线程间通讯 作者:韩耀旭 原文地址:http://www.vckbase.com/document/viewdoc/?id=1707 七.线程间通讯 一般而言,应用程序中的一个次要线 ...
- Java多线程学习(八)线程池与Executor 框架
目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...
- Java基础教程:多线程基础(2)——线程间的通信
Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- java多线程系列5-死锁与线程间通信
这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两 ...
- Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)
所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也 ...
- Java学习个人备忘录之线程间的通信
线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...
- Adnroid 源码学习笔记:Handler 线程间通讯
常见的使用Handler线程间通讯: 主线程: Handler handler = new Handler() { @Override public void handleMessage(Messag ...
随机推荐
- kettle菜鸟学习笔记1----相关准备知识
最近导师让给师弟师妹做个关于kettle的培训,瞬间囧了,kettle我也只是简单学过,连皮毛都算不上,而且,上次使用kettle已然是去年的事了…… 没办法,只好重新学习下,好在之前写了几个文档,也 ...
- Oracle 学习笔记2:几个入门常用命令
oracle提供的交互方式有两种:sqlplus(命令行) sqlplusw(图形界面) 进入sqlplus方式:cmd中输入sqlplus 进入sqlplusw方式:cmd中输入sqlplusw 更 ...
- Layabox:全球唯一Flash直接开发H5的工具Laya.Flash终于开放(转)
HTML5是风口,但年轻幼稚,Flash昔日黄花,但丰满妖娆,Layabox使用Flash直接开发HTML5(或编译页游),渴望性感而青春,但久在深闺,只见于一些大企业和朋友圈中,被指“饥饿营销”,保 ...
- Part 2 How are the URL's mapped to Controller Action Methods?
Part 2 How are the URL's mapped to Controller Action Methods? The answer is ASP.NET Routing.Notice t ...
- Jquery 计算表格某一列的合计
<script type="text/javascript"> function heji(table_id, lie, val_id) { //合计 --xpp // ...
- web HTML5 调用摄像头的代码
最近公司要求做一个在线拍照的功能,具体代码如下: <html> <head> <title>html5调用摄像头拍照</title> <style ...
- UI3_UIViewController生命周期
// // SecondViewController.h // UI3_UIViewController生命周期 // // Created by zhangxueming on 15/7/2. // ...
- vi 命令行模式功能键
目录 目录内容 I 切换到插入模式,此时光标位于开始输入文件处 A 切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字 O 切换到插入模式,并从行首开始插入行的一行 [ctrl]+[b] 屏 ...
- 链表的创建、测长、排序、插入、逆序的实现(C语言)
#include <stdio.h> #define END_elem 0 struct node { int date; struct node * next; }; //链表创建 no ...
- STL学习笔记序言
笔者作为计算机科学与技术专业的学生,学习并使用C++已经有3年了.在接触STL之前的编程习惯是,所有程序的功能包括数据结构.算法等都是亲自实现,效率极其缓慢.后来从使用STL的vector开始慢慢的感 ...