c# 线程浅析(代理 、Invoke、Lock)
前言:本来想根据自己的经验总结一下c#线程相关的知识点, 写之前看了一些其他人的博客,发现自己也就掌握了不到三分之一。。。。希望通过这次的博客将自己的知识点补充一下,写出更直白的博客和初学者分享。
这是我参考的博客地址:http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 。
这个是他参考的英文原著地址:http://www.albahari.com/threading/
原博客介绍的可以说深入浅出,鞭辟入里。不过我想写出更适合小白的,直接拿去就可以用到程序里的博客。
一. 什么是线程(知道下面几点有助于了解)
1. 一个CPU同一时间只能做一件事,不过它处理信息太快了,甚至我们使用它的时候,把它分成了很多的时钟周期(就是很短的时间间隔),再去把这些之间间隔分配个不同的应用,它也能很顺畅的完成处理。就好像它能同时处理很多事一样,我们根据这一点,就可以进行多线程,和多进程编程了。
2.进程是资源分配的基本单位。我们创建一个程序,默认是一个进程的,这个进程中包含了一个线程(主线程)。现在我们要在这个基础上再去进行创建新的线程。(很多时候需要这样)
3.进程中的线程,可以共享进程中的资源。
4.线程是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。
二.为什么要开启新的线程
有很多时候主线程处理数据消耗太多时间,导致鼠标不能用,程序看起来卡住了。这时候,我们可以把消耗时间的事放到一个单独的线程里,让主线程轻松起来。
三. 多线程的使用
1.目标
在主线程中开启一个线程,线程传回数据在主窗体中的文本框中显示。

下面是所有的代码,其中包括了代理 、Invoke、Lock,的使用。这个小的例子就可以帮助你开始使用线程了。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading; namespace 线程浅析
{
//创建SetValue的委托
public delegate void SetValueDel(string str,object obj); public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Thread.CurrentThread.Name = "MainThread";
} //开启一个线程
private void btnStart_Click(object sender, EventArgs e)
{
//将委托的方法和主窗体传过去
NEWThreadClass threadOneClass = new NEWThreadClass(SetValue, this); Thread TheThreadOne = new Thread(threadOneClass.threadOne);//不需要ThreadStart()也可以 TheThreadOne.Name = "TheThreadOne";//给线程命名,方便调试。这行代码可以省略。 //让线程变为后台线程(默认是前台的),这样主线程结束了,这个线程也会结束。要不然,任何前台线程在运行都会保持程序存活。
TheThreadOne.IsBackground = true;
TheThreadOne.Start();
} //给文本框赋值
private void SetValue(string str, object obj)
{
//lock里面的代码同一个时刻,只能被一个线程使用。其它的后面排队。这样防止数据混乱。
lock (obj)
{
this.txtReturnValue.Text = this.txtReturnValue.Text + str;
}
}
} //建一个类,模拟实际使用情况
public class NEWThreadClass
{
//接收主窗体传过来的委托方法。
public SetValueDel setValueDel; //接收主窗体
public Form form; //用于告诉主线程中锁,是哪一个线程调用的。
static object locker = new object(); public NEWThreadClass(SetValueDel del ,Form fom)
{
this.setValueDel = del;
this.form = fom;
}
//第一个线程,给主线程创建的控件传值。
public void threadOne()
{
//这里获取线程的名字
string threadName = Thread.CurrentThread.Name;
try
{
while (true)
{
//告诉主线程,我要更改你的控件了。
this.form.Invoke((EventHandler)(delegate
{
//如果在这里使用Thread.CurrentThread.Name 获取到的是主线程的名字。
setValueDel(threadName + " :Hello!", locker);//给文本框传值,“自己的名字:Hello!”。
}));
Thread.Sleep( * );//太累了 ,休息三秒。。。。
}
}
catch (Exception ex)
{ }
}
}
}
c# 线程浅析(代理 、Invoke、Lock)的更多相关文章
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
- 解决Slave SQL线程Waiting for binlog lock
最近在我们线上库物理备份的时候出现一个奇怪的现象: 我们备份都在从库上备份的,在业务低一般是在晚上2点钟开始备份.有天发现从库的延迟一直在增加,登录上实例,通过show processli ...
- 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步
假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...
- python笔记10-多线程之线程同步(锁lock)
前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...
- C#线程同步技术(一) lock 语句
开篇语: 上班以后,烦恼少了,至少是没有什么好烦的了,只要负责好自己的工作就可以了,因此也有更多的时间去探索自己喜欢的程序.买回来的书已经看了一半,DEMO也敲了不少,昨晚终于在这里开BLOG,记录一 ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
- Java线程锁一个简单Lock
/** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...
- java并发:线程同步机制之Lock
一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...
随机推荐
- 创建Django项目(五)——URL配置和视图
2013-08-07 20:02:10| 1.新建blog的URL文件 在blog目录下新建文件"urls.py" : # -*- coding: ...
- IE插件
在OA上要直接查看word等公告文件,就必须安装office控件.要安装office控件,需要在IE浏览器中做相应的设置.如何设置呢,下面由小编具体介绍下. 工具/原料 OA IE浏览器 方法/步 ...
- windows 7 忘記密碼,用“带命令行的安全模式”
net user administrator /active:yes net user tester /add net localgroup administrators tester /add
- AutoCAD如何方便截图放到Word文档,改成白底黑字
将模型视图切换到布局2即可 比如下图所示的效果 先回到模型视图把所有线条颜色都改成白色,然后添加适当的标注(比如要受力分析,则在CAD中绘制箭头也很方便的),文字说明.然后切换到布局2就OK ...
- 在DevExpress GridControl的一列中显示图片
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 近期做项目的时候用到了将GridControl中一列设置为PictureEdit类型,然后通过这一 ...
- Xcode中git的用法介绍与"Please tell me who you are"问题的解决方式
我在之前多篇博客中解说了怎样使用命令行操作git,能够大大提高我们的工作效率.详细能够參考<Git学习札记><Git学习札记--进阶>等文章.事实上对于同一个工具,我们有不同的 ...
- react-native redux 操作
1.项目目录 2.redux (1)app/redux/action/action.js /** * 步骤一 * 行为 action */ // 定义行为名称 export const CHANGE_ ...
- mysql导出整个数据库
mysql导出整个数据库 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql mysqldump - ...
- Estimating duration from bitrate, this may be inaccurate
通过 ffmpeg 获取 媒体 播放时长 ./ffmpeg-linux64-v3.3.1 -i /tmp/mp30001.mp3 ffmpeg version N-86111-ga441aa90e8 ...
- mysql_connect 等待时间长,修改连接地址为127.0.0.1即可
程序搬家后,运行非常慢分析流程: 1.外网的等待时间太长 2.内容等待时间也很长 3.断点查到仅仅一句 mysql_connect ("localhost",***,***)就要1 ...