线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading
入门--------------------------------------------------------------------------------
概述与概念
一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建。
创建和开始使用多线程
public Window1()
{
//主线程
//Code……
//使用匿名方法来启动子线程
Thread t = new Thread(delegate() {Code……});
t.Start();
}
子进程创建实例
//1.创建子线程
public Window1()
{
//创建子进程
Thread threadA = new Thread(new ThreadStart(WorkMethod));
threadA.Start();
}
//子进程启动程序
void WorkMethod()
{
this.textBox1.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
textBox1.AppendText(Environment.NewLine);
this.textBox1.AppendText("子线程执行完成!");
});
}
//2.使用匿名委托来启动子线程
public Window1()
{
Thread t = new Thread(delegate() {
this.textBox1.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
textBox1.AppendText(Environment.NewLine);
this.textBox1.AppendText("子线程执行完成!");
});
});
t.Start();
}
//3.使用匿名委托来启动子线程
public Window1()
{
InitializeComponent();
textBox1.AppendText("主线程执行完成");
new Thread(() =>
{
this.Dispatcher.Invoke(new Action(() =>
{
textBox1.AppendText(Environment.NewLine);
textBox1.AppendText("子线程执行完成");
}));
}).Start();
}
线程同步基础--------------------------------------------------------------------------------
同步要领
锁和线程安全
//将当前线程阻塞指定的时间
Thread.Sleep(TimeSpan.FromSeconds(30));
Interrupt 和 Abort
线程状态
等待句柄
同步环境
使用多线程--------------------------------------------------------------------------------
单元模式和Windows Forms
BackgroundWorker类
ReaderWriterLock类
线程池
异步委托
计时器
public Window1()
{
//计时器 SetTimeInterval
System.Windows.Threading.DispatcherTimer t = new System.Windows.Threading.DispatcherTimer();
t.Interval = new TimeSpan(0, 0, 0, 0, 100);
t.Tick += new EventHandler(timer_Interval);
t.Start();
}
public Window1()
{
//计时器 SetTimeOut
new System.Threading.Timer(new TimerCallback(timer_Callback), this, 5000, 0);
}
局部储存
高级话题--------------------------------------------------------------------------------
非阻止同步
Wait和Pulse
Suspend和Resume
终止线程
同步线程实例
public Window1()
{
InitializeComponent();
this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
this.textBox1.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
textBox1.AppendText(Environment.NewLine);
this.textBox1.AppendText("同步线程执行完成!");
});
}
异步线程实例
public Window1()
{
textBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
{
textBox1.AppendText(Environment.NewLine);
textBox1.AppendText("异步线程执行完成");
}));
}
线程呈现控件实例-可传参数
public Window1()
{
InitializeComponent();
System.Windows.Threading.DispatcherTimer t = new System.Windows.Threading.DispatcherTimer();
t.Interval = new TimeSpan(0, 0, 0, 0, 1000);
t.Tick += new EventHandler(Dispatcher_Timer);
t.Start();
}
private delegate void DispatcherDelegate(string msg);
private void OutPut(string msg)
{
textBox1.Dispatcher.Invoke(new DispatcherDelegate(DelegateMethod), msg);
}
private void DelegateMethod(string msg)
{
textBox1.AppendText(msg);
textBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
textBox1.AppendText(Environment.NewLine);
}
void Dispatcher_Timer(object sender, EventArgs e)
{
OutPut("控件呈现:");
}
线程呈现控件实例-使用匿名委托
public Window1()
{
InitializeComponent();
this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
System.Windows.Threading.DispatcherTimer t = new System.Windows.Threading.DispatcherTimer();
t.Interval = new TimeSpan(0, 0, 0, 0, 1000);
t.Tick += new EventHandler(Dispatcher_Timer);
t.Start();
}
void Dispatcher_Timer(object sender, EventArgs e)
{
textBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
{
textBox1.AppendText("控件呈现:");
textBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
textBox1.AppendText(Environment.NewLine);
}));
}
线程呈现控件实例-匿名方法并返回参数
public Window1()
{
InitializeComponent();
System.Windows.Threading.DispatcherTimer t = new System.Windows.Threading.DispatcherTimer();
t.Interval = new TimeSpan(0, 0, 0, 0, 1000);
t.Tick += new EventHandler(Dispatcher_Timer);
t.Start();
}
void Dispatcher_Timer(object sender, EventArgs e)
{
string strmsg = (string)textBox1.Dispatcher.Invoke(new Func<string>(() =>
{
textBox1.AppendText("控件呈现:");
textBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
textBox1.AppendText(Environment.NewLine);
return textBox1.Text;
}));
}
线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading的更多相关文章
- 使用C++11 开发一个半同步半异步线程池
摘自:<深入应用C++11>第九章 实际中,主要有两种方法处理大量的并发任务,一种是一个请求由系统产生一个相应的处理请求的线程(一对一) 另外一种是系统预先生成一些用于处理请求的进程,当请 ...
- 使用C++11实现一个半同步半异步线程池
前言 C++11之前我们使用线程需要系统提供API.posix线程库或者使用boost提供的线程库,C++11后就加入了跨平台的线程类std::thread,线程同步相关类std::mutex.std ...
- c++11 实现半同步半异步线程池
感受: 随着深入学习,现代c++给我带来越来越多的惊喜- c++真的变强大了. 半同步半异步线程池: 事实上非常好理解.分为三层 同步层:通过IO复用或者其它多线程多进程等不断的将待处理事件加入到队列 ...
- (原创)C++半同步半异步线程池2
(原创)C++半同步半异步线程池 c++11 boost技术交流群:296561497,欢迎大家来交流技术. 线程池可以高效的处理任务,线程池中开启多个线程,等待同步队列中的任务到来,任务到来多个线程 ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
- C++11 半同步半异步线程池的实现
#include <list> #include <mutex> #include <thread> #include <condition_variable ...
- 关于GCD同步组实现多个异步线程的同步执行中的注意点
在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...
- 安卓 异步线程更新Ui
异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...
- Erlang运行时中的无锁队列及其在异步线程中的应用
本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang ...
- Spring Boot系列二 Spring @Async异步线程池用法总结
1. TaskExecutor Spring异步线程池的接口类,其实质是java.util.concurrent.Executor Spring 已经实现的异常线程池: 1. SimpleAsyncT ...
随机推荐
- 报错:TargetException, 非静态方法需要一个目标
如果实例为null,调用实例方法会报如上错. 解决办法: 检查实例是否为null,考虑什么情况下实例为null,然后排除实例为null的情况.
- 通过连接池和字段索引,提升单点登录cas的性能
cas是多个系统的中心认证,认证的过程就是用户的登录信息和数据库中的信息匹对的过程,假设某一时刻登录的人数非常多,须要频繁的读取数据库,数据库连接的管理就是问题. 前天測试评教时无意之中把单点登录的问 ...
- JS --- reduce()函数
定义: reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值.对空数组是不会执行回调函数的. 案例 计算数组总和 var num = [1,2,3,4,5 ...
- 傲骨贤妻第一季/全集The Good Wife迅雷下载
第一季 The Good Wife Season 1 (2009)看点:在经受丈夫Peter的背叛以及因此而带来的公众羞辱后,Alicia Florrick选择重新继续自己原来的事业,一名辩护律师,以 ...
- 冰血暴第一季/全集Fargo迅雷下载
冰血暴 第一季 Fargo 1 (2014)本季看点: 该剧改编自科恩兄弟获得1996年奥斯卡提名的同名经典影片,计划总共拍摄10集,第一季将讲述一个完整的故事.由<识骨寻踪第一季>编剧诺 ...
- hydra 安装和使用
udo add-apt-repository ppa:pi-rho/security sudo apt-get update sudo apt-get install hydra hydra -l r ...
- rocketmq 管理控制台
docker pull styletang/rocketmq-console-ng docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=1 ...
- Java SPI(Service Provider Interface)简介
SPI 简介 SPI 全称为(Service Provider Interface),是JDK内置的一种服务提供发现机制. 一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这 ...
- Oracle简单的备份和恢复-导出和导入(2)
ylbtech-Oracle:Oracle简单的备份和恢复-导出和导入(2) 简单的备份和恢复-导出和导入(2) 1. 用户导入导出文件中的一张表(emp)返回顶部 0.1, 我们在sql plus中 ...
- C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大 ...