C#之初识异步
程序员文章站
2022-07-21 17:52:27
什么是异步 举个例子:小明的妈妈让小明烧一壶水,水烧开后要倒进水壶里,同时还需要把家里打扫一下. 小明的操作流程一:烧水 >等待至水烧开 >水倒进水壶里 >打扫家务 小明的操作流程二:烧水 >打扫家务 >等水烧开了就将水倒进水壶里 >继续打扫家务. 第二种方式就是异步. 异步的使用 一.以委托方式调 ......
什么是异步
举个例子:小明的妈妈让小明烧一壶水,水烧开后要倒进水壶里,同时还需要把家里打扫一下.
小明的操作流程一:烧水---->等待至水烧开----->水倒进水壶里-------->打扫家务
小明的操作流程二:烧水----->打扫家务-------->等水烧开了就将水倒进水壶里-------->继续打扫家务.
第二种方式就是异步.
异步的使用
一.以委托方式调用异步
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("计算错误!"); }
运行结果 ;其中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"); }
运行结果, ,可以看到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); } }
运行结果
await表示的是await xx()之后的方法时异步的, xx()方法依然是在主线程中执行的,所以write2()中的
console.writeline("hello world!")是在主线程中完成的,write3()的第一次循环也是在主线程中完成的,然后第一次结束后有一个
await task.delay(1000);所以第二次循环是在异步线程中完成的.
上一篇: 喝酒前吃什么不容易醉这里帮你解答哦