.Net 异步调用

.NET异步编程之新利器——Task与Await、Async

一.  FrameWork 4.0之前的线程世界    

    在.NET FrameWork 4.0之前,如果我们使用线程。一般有以下几种方式:

  • 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程。
  • 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用。
  • 使用BeginInvoke,EndInvoke,BeginRead,EnRead,BeginWrite,EndWrite等一系列的异步方法。
  • 使用System.ComponentModel.BackgroundWorker控件,调用实例方法RunWorkerAsync(),开启一个新线程。 

二.  .Net 传统异步编程概述 

  • 异步编程模型 (APM),在该模型中异步操作由一对 Begin/End 方法(如 FileStream.BeginRead 和 Stream.EndRead)表示。
  • 基于事件的异步模式 (EAP),在该模式中异步操作由名为“操作名称Async”和“操作名称Completed”的方法/事件对(例如 WebClient.DownloadStringAsync 和 WebClient.DownloadStringCompleted)表示。 (EAP 是在 .NET Framework 2.0 版中引入的,在silverlight或者wpf变成中经常用到)。

三.  Task 的优点以及功能   

  • 在任务启动后,可以随时以任务延续的形式注册回调。
  • 通过使用 ContinueWhenAll 和 ContinueWhenAny 方法或者 WaitAll 方法或 WaitAny 方法,协调多个为了响应 Begin_ 方法而执行的操作。
  • 在同一 Task 对象中封装异步 I/O 绑定和计算绑定操作。
  • 监视 Task 对象的状态。
  • 使用 TaskCompletionSource 将操作的状态封送到 Task 对象。

四.  TASK的用法

     请参考这篇文章

五.  使用 Task 封装常见的异步编程模式

  • 使用Task封装APM异步编程模式。C#5.0中提供的async和await使异步编程更简单。await在msdn的解释是“运算符应用于一个异步方法的任务挂起方法的执行,直到等待任务完成。 任务表示正在进行的工作。”它返回的结果是Task和Task<TResult>.下面我们就用一个demo具体解析:

private async void Init()
{
      //部分代码省略
    var orgs = await _serviceClient.GetAllOrganizationTaskAsync();
}

//通过WCF调用,采取分布类,名称一样。
public partial class ServiceClient
{
 public Task<ObservableCollection<Organization>>   GetAllOrganizationTaskAsync()
         {
            //Task 封装APM
             return Task<ObservableCollection<Organization>>.Factory.FromAsync(this.Channel.BeginGetAllOrganization,                                                      this.Channel.EndGetAllOrganization, null);
         }
}

  • 使用 Task 对象封装 EPM 异步模式 。 这种模式从 .Net 2.0 开始出现, 同时在 Silverlight 中大量出现, 这种异步模式以 “操作名称Async” 函数和 “操作名称Completed” 事件成对出现为特征。常见的操作有使用lamda表达式;或者使用+=“操作名称Completed”(tip:如果使用lamda表达式,无法回收资源,如果同时调用多个,数据会乱套,建议如果非要用,最好用+=“操作名称Completed”,在操作名称Completed事件中再-=“操作名称Completed”)。
    关键字:TaskCompletionSource,简单理解委托给task属性,利用task来操作。

var source = new TaskCompletionSource<string>();

var webClient = new WebClient();

webClient.DownloadStringCompleted += (sender, args) => {

   if (args.Cancelled) {

      source.SetCanceled();

      return;

   }

   if (args.Error != null) {

      source.SetException(args.Error);

      return;

   }

   source.SetResult(args.Result);

};

webClient.DownloadStringAsync(new Uri(UrlToTest, UriKind.Absolute), null);

source.Task.Wait();

var result = source.Task.Result;

此博客来自于http://www.cnblogs.com/luqixinhe/archive/2013/07/18/3197645.html,记录时为了更好的学习。

.Net 异步调用

时间: 2025-01-09 10:04:18

.Net 异步调用的相关文章

(转)spring boot注解 [email&#160;protected] 异步调用

原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. 1 @Component 2 public class Task { 3 4 @Async 5 public void doTaskOne() throws Exception { 6 // 同上内容,省略 7 } 8 9 @Async 10 public void doTaskTwo() throws

CXF简单示例(二)之异步调用

在实际使用中,客户端在调用服务时,并不能及时得到响应,比如调用的服务本身是一个耗时费事的活,服务器破死命的跑,也只能在一分钟后才能够返回结果,这时候如果是同步的情况,那么客户端就必须在这里到等上一分钟,啥事不干.这肯定是不能容忍的,光吃饭不干活,再有这么好的事,请告诉我! OK,所以我们需要异步调用. 在这里,先介绍CXF提供的一个工具:WSDL2Java. 我们可以方便的利用它来生成相应的客户端接口,配置什么的脏活累活它都给我们干了,而我们只需要这样直接用就行了. 1. 获得服务的WSDL路径

spring-boot实战【10】【转】:Spring Boot中使用@Async实现异步调用

什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序. 同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

简述自己用过的几种异步调用方式

直接上代码 1.BeginInvoke和EndInvoke方式 private static void BeginInvoke1() { Func<int,string> fun = Todo; for (int i = 0; i < 5; i++) { //fun.BeginInvoke(i,TodoCallBack, fun); /* 异步调用委托BeginInvoke * handler.EndInvoke(x)为执行委托的结果 */ fun.BeginInvoke(i, x =&

C#委托异步调用

废话不多说,直接上代码(PS:我就喜欢简单.直接.粗暴) using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading;using System.Threading.Tasks; namespace 异步调用委托{    class Program    {       

同步调用和异步调用同时存在导致的混乱

其实在Promise之外也存在这个问题,这里我们以一般的使用情况来考虑此问题.这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用.下面我们以 onReady(fn) 为例进行说明,这个函数会接收一个回调函数进行处理. mixed-onready.js function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' ||

WCF的异步调用

1.服务契约 namespace Contracts { [ServiceContract] public interface ICalculator { [OperationContract] double Add(double x,double y); } } 2.服务实现 namespace Services { public class CalculatorService:ICalculator { public double Add(double x, double y) { retu

Axis2发布webservice(4)&mdash;webservice的异步调用

一,发布一个webservice,代码如下 package com.hoo.service; public class AsynchronousService { public String execute() throws InterruptedException{ //让当前线程睡眠5钟,展示异步调用 Thread.sleep(5000); return "done"; } } 二.发布Service,参见前面教程,不多讲 三.RPC方式异步调用: import java.io.I

C#异步调用

在有时候,我们要从一些外设备或是网络索取大量数据时,外设备可能须要处理非常久才干把传输数据回计算机,这时我们仅仅有傻傻的等待. 但我们採用异步方法就不同了,我们能够利用这点时间去做别的事,等待完毕后,再通知我们接收. 1.怎样进行异步调用 (1)定义要运行异步的方法. (2)定义一个与运行异步方法同样签名的托付. (3)实例化该托付,该托付应该指向该异步方法. (4)利用BeginInvoke启动异步方法. (5)利用EndInvoke得到结果. (6)设置回调方法.(非必需) 2.BeginI

MVC4 Task.Factory.StartNew 异步调用

MVC4也添加了一些异步的东西,不过一枝都没有研究过. 工作上遇到了发出一个调用,但是不去管调用结果如何的情况,在谢平师傅的指导下, 写成如下异步方式 Task.Factory.StartNew(() => { if (entity.IsManager == true) { bool resultSetOnlineReportOn = ReportOnlineProxy.SaveUIDPermissions(entity.Uid, true); } else { bool resultSetOn