多线程学习之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 ...
随机推荐
- 你所不知道的html5与html中的那些事第三篇
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
- WCF之服务元数据
服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点 ...
- (转)Yale CAS + .net Client 实现 SSO(4)
第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 1.下载 Microsoft JDBC ...
- SPA解释:单页应用程序
单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序. 单页W ...
- 非常难得的iPad版房地产售楼助手应用
一款高质量的iPad房地产售楼助手应用,采用的是类似facebook,新浪微博,腾讯微博,人人网的布局视图.功能有:客户管理系统(可添加,编辑等):2.房源管理系统;3.房贷计算器等,这个应用无论是布 ...
- SPL标准库常用的数据结构
栈数据结构 $stack = new SplStack(); //栈数据结构->先进后出 2 $stack->push('data1'); //入栈 $stack->push('da ...
- L014-oldboy-mysql-dba-lesson14
L014-oldboy-mysql-dba-lesson14 来自为知笔记(Wiz) 附件列表
- android activity空指针异常解决问题解决
今天在开发过程中,遇到了一个错误 unable to instantiate activity componentinfo java.lang.nullpointerexception google之 ...
- javascript "\" 在字符串里的是转义的意思
"\n" 在字符串里是换行的意思 alert("dfdsad\ndfsdf"); //有换行 alert("abc\de"); // ...
- JQGrid+Webservice+LINQ
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="jqgridtest.asp ...