创建线程的常用方法:异步委托、定时器、Thread类

理解程序、进程、线程三者之间的区别:简而言之,一个程序至少有一个进程,一个进程至少有一个线程
进程就是在内存中运行的程序(即运行着的程序);一个进程一般只有一个线程,一个进程可以包含多个线程(多线程编程);

使用异步编程的简单机制一:异步委托
    委托类型的BeginInvoke和EndInvoke方法。
        BeginInvoke方法:
            参数组成:引用方法的参数列表+callback参数+state参数
            返回值:IAsyncResult接口类型(接口介绍:这个接口有两个重要属性:IsCompleted属性 bool类型 表示异步线程(方法)是否执行完成;
            AsyncResult类实现了IAsyncResult,它有一个重要的成员:AsyncDeleget 返回被调用的委托的引用)

      IAsyncResult类型的方法:.AsyncWaitHandle.WaitOne(50,false)   指定时间间隔内异步方法还没运行完毕 返回false  否则返回true
            
            方法被调用时做了哪些事:
            1.在线程池中获取一个线程,当这个线程被调度时,执行委托列表方法;
            2.返回给主线程一个IAsyncResult对象的引用;
            
        EndInvoke方法:
            参数组成:IAsyncResult类型
            返回值:被调用的委托的返回值类型
            
             方法被调用时做了哪些事:
             根据参数:IAsyncResult对象找到关联的线程,
             如果这个线程已经执行完毕,EedInvoke做如下有些事:清理线程的状态和资源;找到引用方法的返回值,并把它作为自己的返回值返回。
             如果这个线程没有执行完毕,调用线程就会停止并等待,知道清理完成并返回值。

异步编程的三者模式:等待直到完成模式、轮询模式、回调模式.
下面给个回调模式的列子:
    public class TestThreading
    {
        public static int Method(int n, int m)
        {
            Console.WriteLine("异步方法内部开始");
            System.Threading.Thread.Sleep(5000);
            return n > m ? n : m;
        }

public static void CallBack(IAsyncResult ia)
        {

AsyncResult ar = (AsyncResult)ia;
            MyDel del = (MyDel)ar.AsyncDelegate;
            int result = del.EndInvoke(ia);
            Console.WriteLine(result);

}
    }
    
    static void Main(string[] args)
    {
            #region 异步编程与线程
            
            Console.WriteLine("Main中的处理代码。。。。。");
            MyDel del = new MyDel(TestThreading.Method);
            Console.WriteLine("BeginInvoke 方法调用之前");
            IAsyncResult ia = del.BeginInvoke(32, 100, TestThreading.CallBack, null);
            Console.WriteLine("BeginInvoke调用之后,Main继续做别的事情");
            System.Threading.Thread.Sleep(5000);
            Console.WriteLine("Main 程序结束");
            
            #endregion
    }
    
使用异步编程的简单机制二:计时器
.Net BCL 提供了好几个Timer类,在这里我只介绍System.Threading中的Timer
首先看下Timer最常用的构造函数:
Timer(TimerCallback callback,objec state,int dueTime,int period)

下面分别介绍下各个参数,介绍完了你就会用Timer实现异步编程了:
TimerCallback 是一个委托类型,定义如下   void TimerCallback(object state) 这个就是回调函数,计时器在每次时间到时执行回调方法
state 就是要传给回调方法的参数
dueTime 就是回调方法在第一次被执行之前的时间
period 是两次调用回调方法之间的时间间隔

Demo如下:

public class TestTimer
    {
        public static void TimerCallBack(object o)
        {
            Console.WriteLine("{0},{1}",o,DateTime.Now.ToString("yy:MM:dd HH:mm:ss"));
        }
    }
    
     static void Main(string[] args)
    {
    
        #region Timer类的使用(System.Threading下的)使用Timer发异步(回调函数)

Timer time = new Timer(TestTimer.TimerCallBack, "lxf", 5000, 1000);

#endregion
    }

C#实现异步编程的两个简单机制(异步委托&定时器)及Thread实现多线程的更多相关文章

  1. 异步编程系列第01章 Async异步编程简介

    p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...

  2. Async 、 Await 的异步编程(.NET 4.5 新异步模型) [转自MSDN]

    使用异步编程,可以避免性能瓶颈和增强应用程序的总体响应能力. 但是,编写异步应用程序的以前的技术可能比较复杂,使它们难以编写,调试和维护. Visual Studio 2012 引入了一个简化的方法, ...

  3. C#异步编程(一)线程及异步编程基础

    最近试着做了几个.NET CORE的demo,看了些源码,感觉异步编程在Core里面已经成为主流,而对这块我还没有一个系统的总结,所以就出现了这篇文字,接下来几篇文章,我会总结下异步编程的思路,主要参 ...

  4. C#异步:实现一个最简单的异步

    异步就是方法异步执行, 这个好理解. 异步有啥用? 以前只是听说过, 也不想计较. 不过还是碰到了需要这个东西的时候. 比如: 定时执行, 如果不用异步方法,也不用定时器,只用Thread.Sleep ...

  5. 异步编程的两种模型,闭包回调,和Lua的coroutine,到底哪一种消耗更大

    今天和人讨论了一下CPS变形为闭包回调(典型为C#和JS),以及Lua这种具有真正堆栈,可以yield和resume的coroutine,两种以同步的形式写异步处理逻辑的解决方案的优缺点.之后生出疑问 ...

  6. JavaScript 异步编程(一):认识异步编程

    前言 "异步"的大规模流行是在 Web 2.0浪潮中,它伴随着 AJAX 席卷了 Web.前端充斥了各种 AJAX 和事件,这些都是典型的异步应用场景.现在的 Web 应用已经不再 ...

  7. 你不知道的JavaScript--Item27 异步编程异常解决方案

    1.JavaScript异步编程的两个核心难点 异步I/O.事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络.文件访问功能,且使之在后端实现了较高的性能.然而异步风格也引来了一 ...

  8. 简单实现异步编程promise模式

    本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多 ...

  9. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

随机推荐

  1. 跨平台的目录遍历实现方法(windows和linux已经测试)

    dirent.h是gcc下的一个头文件,在windows中是没有的.这个文件中封装了几个对目录进行操作函数: static DIR *opendir (const char *dirname);sta ...

  2. laravel5的坑

    以此记录学习laravel的一些问题 问题:laravel转移文件夹到另外一pc或者环境后访问出现500 设置权限为777 问题: 设置路由后页面总是404 not found 解决:需要在apach ...

  3. Android ScrollView+ViewPager+PullToRefreshListView

    想达到此界面的风格 然后ViewPage里面第一个Fragment是一个瀑布流 这个瀑布流要有加载跟多 在ScrollView中,嵌套ViewPager,在ViewPager的每页使用Fragment ...

  4. android SharedPreferences apply和commit的区别

    1.apply没有返回值而commit返回boolean表明修改是否提交成功2.apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘3.apply ...

  5. 【HDOJ】4363 Draw and paint

    看题解解的.将着色方案映射为40*40*5*5*5*5*2个状态,40*40表示n*m,5*5*5*5表示上下左右相邻块的颜色,0表示未着色.2表示横切或者竖切.基本思路是记忆化搜索然后去重,关键点是 ...

  6. 1210. Kind Spirits(spfa)

    1210 简单模版题 敲个spfa还得瞟下模版.. #include <iostream> #include<cstdio> #include<cstring> # ...

  7. poj 1259 Agri-Net(最小生成树)

    题目:http://poj.org/problem?id=1258 题意:模板题 和2485差不多 就是求相连后的最小值. #include <iostream> #include< ...

  8. 结构体buf_chunk_t

    /** Buffer pool chunk comprising buf_block_t */ typedef struct buf_chunk_struct buf_chunk_t; /** A c ...

  9. bzoj1854

    神奇了 朴素的做法不难想,二分图最大匹配(汗,我其实还是想了一会,太弱了) 左边点集为能打的属性值,右边把武器作为一个点 武器和两个属性连边, 然后和superhero那题差不多,顺次找匹配,找不到了 ...

  10. 读取Excel任务列表并显示在Outlook日历上

    前几天,公司发了一个任务安排,时间不固定,但要求准时到,为了给自己加一个提醒,也为了回顾一下以前的技术,特做了一个Demo. 读取Excel就不多说了,代码很简单,但支持老版本Excel和的版本Exc ...