zoukankan      html  css  js  c++  java
  • 几种异步操作方式

    其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《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);
                
            }
        }
    }
    
    未完待续...
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    字符乱码问题
    一个利用go反向代理解决api转发的例子(go反向代理)
    udp绑定信息
    python3编码转换(字符串/字节码)——Python
    网络UDP——Python
    常用服务器ftp、ssh——Python
    Linux寻找国内镜像源——Python
    常用 Linux 命令的基本使用(二)——Python
    Linux 主要目录速查表——Python
    飞机大战——Python
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1976356.html
Copyright © 2011-2022 走看看