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 ...
随机推荐
- dede调用指定的多个栏目导航
{dede:channelartlist row=' typeid='1,2这里输入多个指定的栏目ID' } <li><a href='{dede:field name='typeu ...
- 如何写一个网页标题title的闪动提示
通过网页title来提示用户有新消息这个功能很常见,比如现在的微博,还有一些邮箱,这个功能都很常见.如何实现则个功能呢? 思路是:通过ajax访问后台,若有新消息,则将网页的title替换为 提示信息 ...
- Android 颜色大全 (colors.xml )
<resources> <color name="pink">#ffc0cb</color><!--粉红色 --> <colo ...
- jboss-AS目录结构了解(资料摘取)
Directory Description bin Contains startup, shutdown and other system-specific scripts. Basically al ...
- ubuntu apache svn 参考
Ubuntu下Subversion服务器的安装配置 本文涉及的范围 要通过 HTTP 协议访问 Subversion 文件仓库,需要安装并配置好 Web 服务器.Apache2 被证实可以很好 ...
- Android相关类关系
Activity Window.WindowManager View. interface----ViewManager LayoutInflater Components Activity.Serv ...
- KEIL段协定
段名转换 Cx51编译器生成的目标代码(程序代码.程序数据和常数数据)保存在代码段或数据段中,一个段可以是可重定位的或绝对的,每个可重定位段有一个类型和一个名称.本节说明Cx51编译器命名这些段的惯例 ...
- b/s客户端和服务器的交互(转)
原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者,你一定会对网络应用如何工作有 ...
- 简单计算器(Android)
aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKC
- 【每天一个Linux命令】19. 创建文件夹目录命令mkdir
命令用途 mkdir 命令用来创建指定的名称的目录 使用说明 1. 创建目录的用户在当前目录中具有写权限 2. 指定的目录名不能是当前目录中已有的目录. 命令实例 0. 帮助文件 bixiaopen ...