欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#之初识异步

程序员文章站 2023-11-23 11:22:16
什么是异步 举个例子:小明的妈妈让小明烧一壶水,水烧开后要倒进水壶里,同时还需要把家里打扫一下. 小明的操作流程一:烧水 >等待至水烧开 >水倒进水壶里 >打扫家务 小明的操作流程二:烧水 >打扫家务 >等水烧开了就将水倒进水壶里 >继续打扫家务. 第二种方式就是异步. 异步的使用 一.以委托方式调 ......

什么是异步

  举个例子:小明的妈妈让小明烧一壶水,水烧开后要倒进水壶里,同时还需要把家里打扫一下.  

    小明的操作流程一:烧水---->等待至水烧开----->水倒进水壶里-------->打扫家务

    小明的操作流程二:烧水----->打扫家务-------->等水烧开了就将水倒进水壶里-------->继续打扫家务.

  第二种方式就是异步.

 

异步的使用

  一.以委托方式调用异步

  delegate void write();

        static void main(string[] args)
        {
            console.writeline("我是主线程");

            write write = new write(new program().writeline);
            write.begininvoke(new program().judge, null);
            console.writeline("我还是是主线程");
            console.read();
        }

        private void writeline() {
            console.writeline("开始计算1+1");
            thread.sleep(3000);
            console.writeline("结果是3!");
        }

        private void judge(iasyncresult async) {
            console.writeline("计算错误!");
        }

运行结果C#之初识异步  ;其中writeline()是需要异步执行的方法,judge()是异步执行完之后调用的方法,如果没有回调,则在执行委托时 将  new program().judge  改成null就行了.

 

  二. async、await

 

异步方法需要用async关键字标记,但async标记的方法不一定是异步方法.

  

  static void main(string[] args)
        {
            console.writeline("我是主线程1");
            task task =new program(). write1();
            console.writeline("我是主线程2");
            console.read();
        }

        private async task write1() 
        {
            int po = thread.currentthread.managedthreadid;
            console.writeline(po);
            console.writeline("first async run end");
        }

 

  运行结果,C#之初识异步  ,可以看到write1()依然是在主线程中执行的.

 

await的使用限制:必须在有async标记的方法中使用.后面接的方法的返回值类型必须是task或task<t>..

 

  static void main(string[] args)
        {
            console.writeline("我是主线程1");
            task task =new program(). write1();
            console.writeline("我是主线程2");
            console.read();
        }
      
        private async task write1() 
        {
            await write2();
            int po = thread.currentthread.managedthreadid;
            console.writeline(po);
            console.writeline("first async run end");
        }
        private async task write2()
        { 
            console.writeline("hello world!");
            await write3();
            for (int i = 0; i < 3; i++)
            {   
                int po = thread.currentthread.managedthreadid;
                console.writeline(po);
                console.writeline("working..{0}", i);
                await task.delay(1000); //和thread.sleep(1000)效果一样.
            }
        }

        private async task write3() {
           
            for (int i = 0; i < 3; i++)
            {
                int po = thread.currentthread.managedthreadid;
                console.writeline(po);
                console.writeline("wirte3");
                await task.delay(1000);
            }
        }

 

 

 

  运行结果C#之初识异步

await表示的是await  xx()之后的方法时异步的, xx()方法依然是在主线程中执行的,所以write2()中的

console.writeline("hello world!")是在主线程中完成的,write3()的第一次循环也是在主线程中完成的,然后第一次结束后有一个
 await task.delay(1000);所以第二次循环是在异步线程中完成的.