C#常用多线程方法
1. Thread类
C#多线程编程中Thread类需要包含名称空间System.Threading。
class Program
{
static void Main(string[] args)
{
Thread thread01 = new Thread(ThreadTask01);
thread01.Start();
// thread01.Join();
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread Main is working !");
Thread.Sleep(20);
}
Console.ReadKey();
}
static void ThreadTask01()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread task one is working !");
Thread.Sleep(20);
}
}
}
输出:
Start不会阻塞主线程,如果加入Join,则会阻塞主线程的执行,直到子线程执行完成才把控制权交还给主流程,但是各个子线程之间的并行执行不受Join影响。上例中加入Join的输出:
多个线程同时访问一个公共字段时,容易引起线程安全问题,C#中使用关键字lock保证数据的安全性和同步:
class Program
{
//static readonly object locker = new object();
static int TotalNum = 100;
static void Main(string[] args)
{
Thread thread01 = new Thread(ThreadTask01);
Thread thread02 = new Thread(ThreadTask02);
thread01.Start();
thread02.Start();
Console.ReadKey();
}
static void ThreadTask01()
{
while (TotalNum > 0)
{
Console.WriteLine(TotalNum);
TotalNum--;
Thread.Sleep(10);
}
}
static void ThreadTask02()
{
while (TotalNum > 0)
{
Console.WriteLine(TotalNum);
TotalNum--;
Thread.Sleep(10);
}
}
}
输出异常,中间有重复输出的数字:
添加lock:
class Program
{
static readonly object locker = new object();
static int TotalNum = 100;
static void Main(string[] args)
{
Thread thread01 = new Thread(ThreadTask01);
Thread thread02 = new Thread(ThreadTask02);
thread01.Start();
thread02.Start();
Console.ReadKey();
}
static void ThreadTask01()
{
while (TotalNum > 0)
{
lock (locker)
{
Console.WriteLine(TotalNum);
TotalNum--;
}
Thread.Sleep(10);
}
}
static void ThreadTask02()
{
while (TotalNum > 0)
{
lock (locker)
{
Console.WriteLine(TotalNum);
TotalNum--;
}
Thread.Sleep(10);
}
}
}
输出正常:
2. ParameterThreadStart委托
ParameterThreadStart委托定义为 void ParameterizedThreadStart(Object state)。
class Program
{
static int totalNum = 10;
static void Main(string[] args)
{
ParameterizedThreadStart thread01 = new ParameterizedThreadStart(ThreadTask01);
Thread thread = new Thread(thread01);
thread.Start(totalNum);
Console.ReadKey();
}
static void ThreadTask01(object obj)
{
for (int i = 0; i < Convert.ToInt32(obj); i++)
{
Console.WriteLine(i);
Thread.Sleep(10);
}
}
}
3. 匿名方法
匿名方法启动多线程是使用Thread类的另一种更加灵活的方法。
class Program
{
static void Main(string[] args)
{
ThreadStart threadStart = new ThreadStart(delegate ()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread one is working!");
}
});
Thread thread = new Thread(threadStart);
thread.Start();//多线程启动匿名方法
//等待线程结束
while (thread.ThreadState != ThreadState.Stopped)
{
Thread.Sleep(10);
}
Console.ReadKey();
}
}
4. Delegate委托
委托是一种比较高级的多线程方法,可以传入参数和获取返回值,还可以查询异步操作是否完成。
class Program
{
private delegate int NewTaskDelegate(int ms);
private static int newTask(int ms)
{
Console.WriteLine("任务开始");
Thread.Sleep(ms);
Random random = new Random();
int n = random.Next(10000);
Console.WriteLine("任务完成");
return n;
}
static void Main(string[] args)
{
NewTaskDelegate task = newTask;
IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);
//EndInvoke方法将被阻塞2秒
//使用WaitOne阻塞主线程,直到子线程完成操作
while (!asyncResult.AsyncWaitHandle.WaitOne(100, false))
{
Console.Write("-");
}
while (!asyncResult.IsCompleted) //查询线程是否完成
{
Console.Write("*");
Thread.Sleep(100);
}
int result = task.EndInvoke(asyncResult);
Console.WriteLine(result);
Console.Read();
}
}
C#常用多线程方法的更多相关文章
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- 六种多线程方法解决UI线程堵塞
http://blog.csdn.net/oyi319/article/details/6851371 一.六种多线程方法 .NET Framework2.0框架提供了至少4种方式实现多线程,它们是& ...
- WebAPi添加常用扩展方法及思维发散
前言 在WebAPi中我们通常需要得到请求信息中的查询字符串或者请求头中数据再或者是Cookie中的数据,如果需要大量获取,此时我们应该想到封装一个扩展类来添加扩展方法,从而实现简便快捷的获取. We ...
- StringUtils中的常用的方法
org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...
- JOptionPane类提示框的一些常用的方法
JOptionPane类提示框的一些常用的方法 XMLOracleSwing 最近在做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法. 很方便的,于是就简单的整理了 ...
- 常用js方法
function dateGetter(name, size, offset, trim) { offset = offset || 0; return function (date) { var v ...
- jQuery操作Table tr td常用的方法
虽然现在DIV+CSS进行页的布局大行其道,但是很多地方使用table还是有很多优势,用table展示数据是比较方便的,下面汇总了jQuery操作Table tr td常用的方法,熟记这些操作技巧,下 ...
- iOS常用公共方法
iOS常用公共方法 字数2917 阅读3070 评论45 喜欢236 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat si ...
- org.apache.commons.lang.StringUtils中常用的方法
org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...
随机推荐
- vivado中basic memory生成
vivado中basic memory生成
- widow下svn上传项目时的文件可执行权限问题
还是项目上发现的问题,要上传Android的源码项目.这里客户端是windows的机器, 测试后发现俩个问题. 1. 文件后缀是.so的文件默认上传不了. 2. 文件后缀是.sh的文件,上传后, ...
- swift 旋转加载动画
https://github.com/naoyashiga/RPLoadingAnimation
- php 根据给定的年份和月份获取该年份该月份的起始和结束时间
function getShiJianChuo($nian=0,$yue=0){ if(empty($nian) || empty($yue)){ $now = time(); $nian = dat ...
- 独立博客网站FansUnion.cn运营2年的经验和教训以及未来规划
今天,我把运营了2年的独立博客网站FansUnion给"归零"了. 2012年6月,我成功搭建了自己的博客网站FansUnion.cn,这是由于自己的不懈努力和时代发展成就的 ...
- 【9201】&&【a201】明明的随机数
Time Limit: 10 second Memory Limit: 2 MB 问题描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整 ...
- Windows环境搭建Web自己主动化測试框架Watir(基于Ruby)
web自己主动化測试一直是一个比較迫切的问题 图1-1 须要安装的工具 http://railsinstaller.org/ 由于安装Ruby还须要用到其它的一些开发工具集.所以建议从站点http:/ ...
- Android 使用Canvas在图片上绘制文字
一个小应用,在图片上绘制文字,以下是绘制文字的方法,并且能够实现自动换行,字体自动适配屏幕大小 private void drawNewBitmap(ImageView imageView, Stri ...
- pycharm的集成vim
pycharm的集成vim 1. 基本使用 激活码 BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl ...
- Spring MVC出现POST 400 Bad Request &405 Request method 'GET' not supported
首先描述一下出现错误的情景: 我刚学springmvc,想做一个登录界面的东西.然后试着写了一个controller如下: @RequestMapping(value = "/login&q ...