几种异步操作方式

其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《CLR Via c#》第三版相关章节)

1、利用线程池发起异步操作

using System;
using System.Threading;

namespace Asynchronous
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程:准备发起一系列异步操作...");
            ThreadPool.QueueUserWorkItem(ComputeBoundOp, 5);
            ThreadPool.QueueUserWorkItem(ComputeBoundOp, 7);
            Console.WriteLine("主线程:干其它事情...");
            Thread.Sleep(1000);
            Console.WriteLine("按回车退出...");
            Console.ReadLine();
        }

        private static void ComputeBoundOp(object o)
        {
            Console.WriteLine("异步操作回调:state={0}", o);
            Thread.Sleep(1000);
        }
    }
}

结果:

2、利用Threading.Tasks中的Task

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Asynchronous
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程:准备发起一系列异步操作...");
            Task t = new Task(ComputeBoundOp,5);
            t.Start();
            Console.WriteLine("主线程:干其它事情...");
            Thread.Sleep(1000);
            Console.WriteLine("按回车退出...");
            Console.ReadLine();
        }

        private static void ComputeBoundOp(object o)
        {
            Console.WriteLine("异步操作回调:state={0}", o);
            Thread.Sleep(1000);
        }
    }
}

3、利用System.Threading.Timer

using System;
using System.Threading;

namespace Asynchronous
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程:准备发起一系列异步操作...");
            Timer t = new Timer(ComputeBoundOp, 5, 50, 0);
            Console.WriteLine("主线程:干其它事情...");
            Thread.Sleep(1000);
            Console.WriteLine("按回车退出...");
            Console.ReadLine();
        }

        private static void ComputeBoundOp(object o)
        {
            Console.WriteLine("异步操作回调:state={0}", o);
            Thread.Sleep(1000);
        }
    }
}

4、利用APM(Asynchronous Programming Model)中的beginXXX方法

using System;
using System.Threading;

namespace Asynchronous
{
    class Program
    {
        delegate void MyDelegate(object o);

        static void Main(string[] args)
        {
            Console.WriteLine("主线程:准备发起一系列异步操作...");
            MyDelegate mydelegate = ComputeBoundOp;
            mydelegate.BeginInvoke(null,ComputeBoundOpCallBack,5);
            Console.WriteLine("主线程:干其它事情...");
            Thread.Sleep(5000);
            Console.WriteLine("按回车退出...");
            Console.ReadLine();
        }

        private static void ComputeBoundOp(object o)
        {
            Thread.Sleep(1000);//模拟异步操作在做一些耗时的操作
        }

        private static void ComputeBoundOpCallBack(IAsyncResult ar)
        {
            Console.WriteLine("异步操作的回调:{0}" , ar.AsyncState);

        }
    }
}

未完待续...

时间: 2024-10-23 14:48:55

几种异步操作方式的相关文章

JavaScript中三种异步上传文件方式_javascript技巧

异步上传文件是为了更好的用户体验,是每个前端必须掌握的技能.这里我提出三点有关异步文件上传的方式. 使用第三方控件,如Flash,ActiveX等浏览器插件上传. 使用隐藏的iframe模拟异步上传. 使用XMLHttpRequest2来实现异步上传. 第一种使用浏览器插件上传,需要一定的底层编码功底,在这里我就不讲了,以免误人子弟,提出这点大家可以自行百度. 第二种使用隐藏的iframe模拟异步上传.为什么在这里说的是模拟呢?因为我们其实是将返回结果放在了一个隐藏的iframe中,所以才没有使

C#几种异步编程

所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码. 异步:如果不等待调用的方法执行完,就执行下一行代码. 阅读原文 namespace AsyncProgram { class Program { //Calculate the folder's total size private static Int64 CalculateFolderSize(string FolderName) { if (Directory.Exists(F

.NET异步编程总结----四种实现模式代码总结_实用技巧

最近很忙,既要外出找工作又要兼顾老板公司的项目.今天在公司,忙里偷闲,总结一下.NET中的异步调用函数的实现方法,DebugLZQ在写这篇博文之前自己先动手写了本文的所有示例代码,开写之前是做过功课的,用代码说话方有说服力. 本文的内容旨在用最简洁的代码来把异步调用的方法说清楚,园子里的高手老鸟可以绕行,不喜勿喷,非诚勿扰~ lz的前一篇文章简单的说了下异步,主要是从理解上来讲:这篇文章主要写具体的实现方法.实现异步编程有4种方法可供选择,这4种访求实际上也对应着4种异步调用的模式,分为"等待&

详解android异步更新UI的几种方法

前言 我们知道在Android开发中不能在非ui线程中更新ui,但是,有的时候我们需要在代码中执行一些诸如访问网络.查询数据库等耗时操作,为了不阻塞ui线程,我们时常会开启一个新的线程(工作线程)来执行这些耗时操作,然后我们可能需要将查询到的数据渲染到ui组件上,那么这个时候我们就需要考虑异步更新ui的问题了. android中有下列几种异步更新ui的解决办法: Activity.runOnUiThread(Runnable) View.post(Runnable) long) View.pos

Android异步加载全解析之IntentService

Android异步加载全解析之IntentService 搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask,再不济也使用的Thread,那么这个IntentService是个什么鬼. 相对与前面我们提到的这两种异步加载的方式来说,IntentService有一个最大的特点,就是--IntentService不受大部分UI生命周期的影响,它为后台线程提供了一个更直接的操作方式.不过,IntentService的不足主要体现在以下几点: 不可以直接和UI做

异步调用webservice

     今天学习webservice的异步调用.找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作. 但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法.这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文. 一篇引用自http://book.51cto.com/art/200906/129768.htm,是李天平的.  

异步加载:ControlJS让脚本加载更快的一个模块

文章简介:关于ControlJs的使用和基础讲解. 关于ControlJs一共有三篇文章,这是第一部分.ControlJS是让脚本加载更快的一个模块(a javascript module for making scripts load faster). 三篇文章的结构分别为: 1. async loading2. delayed execution3.overriding document.write关于第一部分的异步加载,这个的关键在于尽快将页面作为html绘制出来,然后再用javascri

java中四种操作xml方式的比较

xml|比较   1. 介绍 1)DOM(JAXP Crimson解析器)         DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还

F#与ASP.NET(2):使用F#实现基于事件的异步模式

在上一篇文章中,我们的简单讨论了.NET中两种异步模型以及它们在异常处理上的区别,并且简单观察了ASP.NET MVC 2中异步Action的编写方式.从中我们得知,ASP.NET MVC 2的异步Action并非使用了传统基于Begin/End的异步编程模型,而是另一种基于事件的异步模式.此外,ASP.NET MVC 2对于这种异步模式提供了必要的支持,使此方面的程序设计变得相对简单一些.但是,简单的原因主要还是在于已经由其他组件提供了良好的,基于事件的异步模式.那么现在我们就来看看一般我们应