c# 中的线程和同步
一、新建线程的3种方法
a)异步委托;b)Thread类;c)线程池;
二、异步委托
1、简单使用,检查委托是否完成其任务
a) 通过 BeginInvoke() 的返回值IAsyncResult 中的成员IsCompleted判断
b)通过 BeginInvoke() 的返回值IAsyncResult 中的成员AsyncWaitHandle.WaitOne(50,false) 函数判断
c)通过异步回调判断
2、获取返回值
通过EndInvoke 函数获取
三、Thread类
1、简单使用
2、给线程传递数据(可以将执行的耗时函数放到一个类中,通过类成员变量传递参数)
四、线程池 (ThreadPool 类来管理线程)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace ThreadExam
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public delegate int AsyncDelegate(int data, int ms); static int timeConsumingWork(int data, int ms)
{
return ;
}
static void workForThread(object data)
{
Debug.WriteLine(data);
}
static void resultCompleted(IAsyncResult ar)
{
int result = (ar.AsyncState as AsyncDelegate).EndInvoke(ar);
Debug.WriteLine(result);
}
private void async_Click(object sender, RoutedEventArgs e)
{
Button asyBtn = sender as Button;
switch (asyBtn.Name)
{
case "async1":
AsyncDelegate asyDeleg = timeConsumingWork;
IAsyncResult ar = asyDeleg.BeginInvoke(, , null, null);
while (!ar.IsCompleted) //一直判断状态
{
Console.Write(".");
Thread.Sleep();
}
int result = asyDeleg.EndInvoke(ar);
Debug.WriteLine(result);
break;
case "async2":
AsyncDelegate asyDeleg2 = timeConsumingWork;
IAsyncResult ar2 = asyDeleg2.BeginInvoke(, , null, null);
while (true)
{
Console.Write(".");
if (ar2.AsyncWaitHandle.WaitOne(, false)) //等待50毫秒后看状态
{
break;
}
}
int result2 = asyDeleg2.EndInvoke(ar2);
Debug.WriteLine(result2);
break;
case "async3":
AsyncDelegate asyDeleg3 = timeConsumingWork;
asyDeleg3.BeginInvoke(, , resultCompleted, asyDeleg3);
break;
case "thread1":
new Thread(workForThread).Start();
break;
case "pool1":
for (int i = ; i < ;i++ )
ThreadPool.QueueUserWorkItem(workForThread, );
break;
}
}
}
}
链接:http://pan.baidu.com/s/1boXqVvx 密码:hqc3
参考:http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html
c# 中的线程和同步的更多相关文章
- eCos中的线程与同步
http://blog.csdn.net/ooaven/article/details/6280018 先看一下eCos线程的创建.控制以及优先级的操作这三个方面的知识,主要是对它的实现方式及API做 ...
- Windows API学习---用户方式中的线程同步
前言 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, Micrsoft Windows的运行性能最好.但是,线程很少能够在所有的时间都独立地进行操作.通常情况下,要生成一些线程来处理 ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- Java中线程的同步问题
在生活中我们时常会遇到同步的问题,而且大多数的实际问题都是线程的同步问题 我这里以生活中的火车售票来进行举例: 假设现在我们总共有1000张票要进行出售,共有10个出售点,那么当售票到最后只有一张票时 ...
- java中的线程问题是(四)——线程同步问题
多线程的并发,给我们编程带来很多好处,完成更多更有效率的程序.但是也给我们带来线程安全问题. 解决问题的关键就是要保证容易出问题的代码的原子性,所谓原子性就是指:当a线程在执行某段代码的时候,别的线程 ...
- Java中的线程同步
Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...
- 关于Java中的线程安全(线程同步)
java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...
- C#中的线程(二)线程同步
C#中的线程(二)线程同步 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslato ...
随机推荐
- Jade学习笔记
初学nodejs,折腾过用handlebars做模板,后来隔了一段重新学习,用了jade,真心简洁……记录一些学习笔记,以备复习. jade是基于缩进的,所以tab与space不能混用: 属性的设置: ...
- [GIT] warning: LF will be replaced by CRLF问题解决方法
原文链接[http://michael-roshen.iteye.com/blog/1328142] 开发环境: 操作系统: windows xp ruby 1.9.2 rails 3.1.3 git ...
- DNS预获取(dns-prefetch)
今天翻看twitter的源码的时候看到了一下内容: <link rel=”dns-prefetch” href=”http://a0.twimg.com”/> <link rel=” ...
- dedecms 织梦ping服务插件 最新破解可用版
dedecms 织梦ping服务插件 最新破解可用版 ping_gbk.xml <module> <baseinfo> name=ping服务 team=井哥 time=20 ...
- swift闭包-备
我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式.函数参数和函数返回值,闭包表达式的运算结果是一种函数类型. Swift中的闭包类似于Objective-C中的代码块.J ...
- 关于MPLS协议几个容易忽略的点
1.随着硬件技术的进步,产生了高速路由器和三层交换机,MPLS提高转发的速度的初衷已经没有多少意义.但是MPLS由于其支持标签栈和面向连接的特点,使其在虚拟专用网,流量工程,QoS等方面得到广泛的应用 ...
- 【Xamarin 开发 IOS --IOS ViewController生命周期】
ViewController ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内 ...
- 函数call相关[ASM]
前言: __cdecl:C/C++函数默认调用约定,参数依次从右向左传递,并压入堆栈,最后由调用函数清空堆栈,这种方式适用于传递参数个数可变的被调用函数,只有被调用函数才知道它传递了多少个参数给被 ...
- Visio 下载,及密钥
Visio2010简体中文高级版(永久激活密钥:GR24B-GC2XY-KRXRG-2TRJJ-4X7DC) ed2k://|file|cn_visio_2010_x64_516562.exe|515 ...
- 2015第23周一SVN插件安装
之前想把eclipse(3.7)的SVN插件版本从1.8.x降到1.6.x,上午折腾了好久没弄好,先是尝试在线安装,按网上说的1.6.x的url安装不成功(可能是网络问题,下载不到资源),然后尝试下载 ...