前言:本来想根据自己的经验总结一下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)的更多相关文章

  1. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  2. 解决Slave SQL线程Waiting for binlog lock

       最近在我们线上库物理备份的时候出现一个奇怪的现象:    我们备份都在从库上备份的,在业务低一般是在晚上2点钟开始备份.有天发现从库的延迟一直在增加,登录上实例,通过show processli ...

  3. 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

    假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...

  4. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

  5. C#线程同步技术(一) lock 语句

    开篇语: 上班以后,烦恼少了,至少是没有什么好烦的了,只要负责好自己的工作就可以了,因此也有更多的时间去探索自己喜欢的程序.买回来的书已经看了一半,DEMO也敲了不少,昨晚终于在这里开BLOG,记录一 ...

  6. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  7. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  8. Java线程锁一个简单Lock

    /** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...

  9. java并发:线程同步机制之Lock

    一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...

随机推荐

  1. 更新数据库中数据时出现: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences 问题

    使用workbench在数据库中更新数据时报错: You are using safe update mode and you tried to update a table without a WH ...

  2. Ubuntu 16.04安装UML工具StarUML 2

    StarUML 2是一个商业软件,但是没有时间限制,就像Sublime Text 3一样.而且具有跨平台,支持Mac.Windows. 这个软件曾经08年的时候在老D的博客上有推荐过,参考:http: ...

  3. Linux挂载新盘

    Linux 系统挂载数据盘 1.查看数据盘 使用“fdisk-l”命令查看 2. 对数据盘进行分区 执行“fdisk /dev/sdb”命令,对数据盘进行分区: 输入“n”,“p”“1”,两次回车,“ ...

  4. Effective C++ Item 41 了解隐式接口和编译期多态

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:class 和 templates 都支持接口和多态. 对 classes 而言接口是 ...

  5. NYOJ 55 懒省事的小明(哈弗曼树)

    懒省事的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述       小明非常想吃果子,正好果园果子熟了. 在果园里,小明已经将全部的果子打了下来,并且按果子的不 ...

  6. HDU 4968(杭电多校#9 1009题)Improving the GPA (瞎搞)

    题目地址:HDU 4968 这题的做法是全部学科的学分情况枚举,然后推断在这样的情况下是否会符合平均分. 直接暴力枚举就可以. 代码例如以下: #include <cstring> #in ...

  7. BNU 25593 Prime Time 记忆化dp

    题目链接:点击打开链接 题意: 一个游戏由3个人轮流玩 每局游戏由当中一名玩家选择一个数字作为開始 目的:获得最小的得分 对于当前玩家 O .面对 u 这个数字 则他的操作有: 1. 计分 u +1 ...

  8. Fragment进阶(五)-----&gt;监听fragment回退事件

    activity_main.xml <? xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  9. Wget下载多个链接

    需要wget下载多个文件链接时,可以采用如下方法: 1. 将链接存入文件url.list中: 2. wget -bc -i url.list -o [log_file] -P [target_dir] ...

  10. 经典面试题回答——学习Java基础的目的

    本系列知识解释:相信每个学习Java的人都是从JavaSE開始的,也就是Java基础開始. 可是却并不清楚学习Java基础究竟有什么用?        首先我来回答这个问题,学习Java基础是有两个目 ...