进程线程 到 异步编程

原创 2016年08月30日 21:33:44

命名空间:using System.Threading;


进程~线程

进程,Process,包含一个运行-ing程序的所有资源。进程之间相互独立,Windows 系统利用进程把工作划分为多个独立的区域。
属性方法
 · Start() - Kill():启动/关闭进程;
 · Close():释放进程占用的资源;
 · GetProcesses():获取计算机上正在运行的所有进程;
 · ID/ProcessName:进程的唯一标识符/名字;
 
线程,Thread,执行线程,体现程序的真实执行情况,是系统负责调度的处理器上的执行单元。
 
线程池,Thread Pool,属于后台线程 Background Thread。CLR 为每一个进程维护一个线程池,异步调用时避免频繁创建、销毁线程的开销。
 
小结
-§- 同一进程的所有线程共享相同的资源和内存;


多进程~多线程

优缺点
-§- 异步编程,执行效率高(多核处理器);
-§- 增加程序负担和额外复杂度(线程的创建、销毁、加载、协调维护);
-§- 同步共享资源的使用;

其他注意事项
-§- Java不能使用多进程,PHP不能使用多线程;

参考
[1]. 多进程多线程小结多线程总结 - DebugLZQ
[2]. 细说多线程(上与下)


异步编程

 同步编程,请求响应模型,同步化、顺序化、事务化。
 异步编程,事件驱动模型,以 Fire and Forget 方式实现。

异步编程模式
-§- 异步编程模型 (APM) 模式: IAsyncResult 模式,异步操作需要 Begin 和 End 方法;
-§- 基于事件的异步模式(EAP):事件、事件处理程序委托类型和 EventArg 派生类型;
-§- 基于任务的异步模式(TAP):推荐模式,.NET Framework 4 引入,基于 System.Threading.Tasks 命名空间,利用一种方法表示异步操作的启动和完成;

 类 LogicalMethodInfo 提供 Invoke 和 BeginInvoke 方法支持同步或异步执行委托的方法:

public sealed class System.Web.Services.Protocols.LogicalMethodInfo{
    public object[] Invoke(object target, object[] values);
    public IAsyncResult BeginInvoke(object target, object[] values, AsyncCallback callback, object asyncState);
    public object[] EndInvoke(object target, IAsyncResult asyncResult);
}

 其中,target 是委托方法所属的类实例,values 是委托方法的参数列表。

异步方法调用模式
 三种方法调用模式区别:原线程获取异步线程已经完成的消息的方式。

  其中,BeginInvoke 方法用于启动异步调用,EndInvoke 方法用于检索并获取异步调用结果然后释放线程占用的资源。BeginInvoke 立即返回,不等待异步方法调用完成,同时在调用时创建一个 AsyncResult 类对象,但是 BeginInvoke 返回 IAsyncResult 接口的引用,可用于监视异步方法的调用进度,调用 BeginInvoke 后可随时调用 EndInvoke 方法。

  其中,IAsyncResult 接口 的 AsyncState 属性获取 Object 类型的对象可以作为 BeginInvoke 方法调用时的 State 参数(可根据需要自定义)。 委托定义和异步委托方法定义为:

public delegate int MyDel(string str);
public static int DelFun(string str){
   Console.WriteLine("异步线程执行方法:DelFun() in " + Thread.CurrentThread.ManagedThreadId);
   Thread.Sleep(3000);
   return str.Length;
}

:BeginInvoke 的参数是在编译时根据委托的定义动态生成的,前面参数的个数和类型与委托定义中的参数个数和类型相同,后两个参数分别是 AsyncCallback 和 Object 类型。BeginInvoke 的调用者的方法列表有且只能有个方法。BeginInvoke 第三个参数可为任意类型,最终都可通过 AsyncState 属性获得对应值。

-§-等待模式 Waiting-Until-Done
  如果异步方法调用未完成,EndInvoke 将一直阻塞到异步方法调用完成才执行。其中,等待 WaitHandle 是一项常用的线程同步技术,可以通过 BeginInvoke 返回的 IAsyncResult 的 AsyncWaitHandle 属性调用 WaitOne() 方法阻止当前线程,直到获取到异步方法调用完成时发出的 WaitHandle 信号。

public static void AsyncWaitingTest()
{         
   MyDel myDel = new MyDel(TestClass.DelFun);

   Console.WriteLine("主线程:AsyncWaitingTest() in " + Thread.CurrentThread.ManagedThreadId);
   IAsyncResult iar = myDel.BeginInvoke("sqh", null, null);
   Console.WriteLine("主线程继续执行... in " + Thread.CurrentThread.ManagedThreadId);

   while (!iar.AsyncWaitHandle.WaitOne(1000)){
      Console.WriteLine("Waiting... AsyncMethod()");
   }
   int strLen = myDel.EndInvoke(iar);
   Console.WriteLine("Str Length:{0}", strLen);
}

-§-轮询模式 Polling
  利用 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性来判断异步方法调用是否完成。

public static void AsyncPollingTest()
{
   MyDel myDel = new MyDel(TestClass.DelFun);

   Console.WriteLine("主线程:AsyncPollingTest() in " + Thread.CurrentThread.ManagedThreadId);
   IAsyncResult iar = myDel.BeginInvoke("sqh", null, null);
   Console.WriteLine("主线程继续执行... in " + Thread.CurrentThread.ManagedThreadId);

   while (!iar.IsCompleted){
      Thread.Sleep(1000);
      Console.WriteLine("Waiting... AsyncMethod()");
   }
   int strLen = myDel.EndInvoke(iar);
   Console.WriteLine("Str Length:{0}", strLen);
}

-§-回调模式 Callback
  调用 BeginInvoke 时提供回调方法,异步方法调用结束后,回调方法在 ThreadPool 中的异步线程上自动执行,并调用 EndInvoke 方法。
  回调方法形如:void AsyncCallback(IAsyncResult iar);

public static void AsyncCallbackTest()
{
   MyDel myDel = new MyDel(TestClass.DelFun);

   Console.WriteLine("主线程:AsyncCallbackTest() in " + Thread.CurrentThread.ManagedThreadId);
   IAsyncResult iar = myDel.BeginInvoke("sqh", CallbackMethod, myDel);
   Console.WriteLine("主线程继续执行... in " + Thread.CurrentThread.ManagedThreadId);
   // ... 其他操作,独立于异步线程
}
public static void CallbackMethod(IAsyncResult iar)
{
   Console.WriteLine("异步方法执行完毕,开始执行回调方法 in " + Thread.CurrentThread.ManagedThreadId);

   //AsyncResult ar = (AsyncResult)iar;  // **推荐**
   //MyDel myDel = (MyDel)ar.AsyncDelegate;           
   MyDel myDel = (MyDel)iar.AsyncState;  // 这种调用方式 BeginInvoke 需要 myDel 参数

   int result = myDel.EndInvoke(iar);
   Console.WriteLine(result);
}

其他:当委托的方法列表中有多个方法时,可以利用 GetInvocationList() 方法得到 Delegate[] 数组,然后依次调用 BeginInvoke 方法,不同的方法在线程池的不同线程上运行!
 
参考
[1]. 异步编程模式系列(1-6)
[2]. 异步方法调用模式总结异步调用四种方法

版权声明:未经宝宝允许不得转载哦,么么哒。

进程线程 到 异步编程

命名空间:using System.Threading;进程~线程 进程,Process。    线程,Thread,执行线程,体现程序的真实执行情况。小结  -§- 同一进程的所有线程共享相同...
  • qing101
  • qing101
  • 2016年08月30日 21:33
  • 388

C#多线程、并行和异步编程学习笔记

一,进程、应用程序域和对象上下文1,CLRCLR(Common Language Runtime,公共语言运行库),主要作用使定位、加载和管理.Net类型,同时负责一些底层细节的工作,如内存管理、应用...
  • Chen_Victor
  • Chen_Victor
  • 2017年08月01日 23:37
  • 1202

异步编程优势难点及解决方案

异步I/O和非阻塞I/O的区别: 阻塞造成CPU等待I/O,浪费等待时间,非阻塞I/O跟阻塞I/O的差别为调用之后会立即返回。 非阻塞的问题是由于完整的I/O并没有完成,立即返回的并不是业务期望的数据...
  • zsr251
  • zsr251
  • 2015年11月20日 17:50
  • 1139

《深入浅出Node.js》学习笔记——(四)异步编程

Node能够迅速成功并流行的原因: ①V8和异步I/O带来的性能提升 ②前后端JavaScript编程风格一致   4.1 函数式编程 4.1.1高阶函数 可以将函数作为参数,或是作为返...
  • oEternalFlame
  • oEternalFlame
  • 2016年05月30日 20:54
  • 1258

C# 多线程、异步编程与并发服务器

一、多线程和异步的区别 多线程和异步操作两者都可以达到避免调用线程阻塞的目的。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。 线程本质上是进程中一段并发...
  • xgf415
  • xgf415
  • 2016年12月23日 15:49
  • 4778

c#线程同步与异步编程

  • 2010年05月13日 16:59
  • 148KB
  • 下载

深入理解 Python 异步编程

原文地址:点击打开链接 来源:阿驹(微信公号:驹说码事)  如有好文章投稿,请点击 → 这里了解详情 前言 很多朋友对异步编程都...
  • QH_JAVA
  • QH_JAVA
  • 2017年09月03日 18:06
  • 557

详解JavaScript异步编程技术

详解JavaScript异步编程技术基于浏览器的事件轮询机制(以及Node.js中的事件轮询机制),JavaScript常常会运行在异步环境中。由于JavaScript本身语言的特性(不需要程序员操控...
  • yuhk231
  • yuhk231
  • 2017年02月08日 17:30
  • 1737

C#:异步编程和线程的使用(.NET 4.5 )

异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。本文中涉及关键知识点1. 异步编程2. 线程的使用3...
  • powertoolsteam
  • powertoolsteam
  • 2015年06月09日 11:13
  • 2522

C#:异步编程和线程的使用(.NET 4.5 )

异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。 本文中涉及关键知识点 1. 异步编程 2. ...
  • LearnboC
  • LearnboC
  • 2017年06月01日 11:28
  • 399
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程线程 到 异步编程
举报原因:
原因补充:

(最多只允许输入30个字)