几种异步操作方式

其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《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);
            
        }
    }
}

未完待续...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

DataTable.Select 返回DataTable

在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地...

23810
来自专栏跟着阿笨一起玩NET

ASP.NET中Cookie跨域的问题及解决代码

http://www.liyumei.net.cn/post/share18.html

14710
来自专栏程序你好

C#代码示例:在WinForm中创建并绑定一个DataTable

在我的一篇文章中,我解释了如何在没有数据库的情况下以web形式绑定gridview。这里,我将解释如何在没有数据库的windows窗体中绑定datagrid。

13940
来自专栏听雨堂

程序实现下载文件或者打开文件

FileInfo DownloadFile = new FileInfo("c:\\a.doc"); // 下面到就是读取文件,通过数据流的方式下载了。 ...

19750
来自专栏木宛城主

SharePoint 2013 How to Backup Site Collection Automatically With a PowerShell Script

In this post I will introduce a way how to run a script for backing up SharePoin...

24870
来自专栏菩提树下的杨过

db4o 7.4 for .net3.5试用手记

db4o虽然出来很久了,一直没怎么关注,今天随手试了下,对于小型应用还是不错的,至少省去了ORM的麻烦,一切皆对象,一切都变得那么自然。 下载地址:http:/...

24990
来自专栏恰童鞋骚年

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我...

9520
来自专栏GreenLeaves

WCF系列教程之WCF客户端异常处理

本文参考自:http://www.cnblogs.com/wangweimutou/p/4414393.html,纯属读书笔记,加深记忆 一、简介 当我们打开W...

21260
来自专栏跟着阿笨一起玩NET

JScriptHelper类

5810
来自专栏飞扬的花生

合并两个结构完全相同的DataTable

两个结构一模一样的DataTable如何合并? 例子:使用Winform进行演示,表2的数据为固定的,表1的数据可以动态添加,通过合并按钮合并表1和表2的数据到...

23750

扫码关注云+社区

领取腾讯云代金券