当前位置: 移动技术网 > IT编程>开发语言>.net > 学习笔记——异步

学习笔记——异步

2018年11月28日  | 移动技术网IT编程  | 我要评论

人民常说的狗官竟是这样由来的,陈郁茹,叶锦茹

1.异步同步的定义

同步方法:多个任务一个一个执行,同一时刻系统中只有一个任务在执行

异步方法:发起一个调用,并不等着计算结束,而是直接去运行下一行;刚才的计算,会启动一个新的线程去执行

 

2.异步同步的比较

2.1. 同步方法卡界面,因为ui线程忙于计算;异步多线程方法不卡界面,主线程闲置,计算任务交给子线程在做;

2.2. 同步方法慢,只有一个线程计算;异步多线程方法快,多个线程并发计算;

       多线程的资源消耗更多,线程并不是越多越好(资源有限/管理线程也消耗资源)

2.3. 异步多线程是无序的:启动无序 执行时间不确定  结束无序,,

       所以不要试图通过启动顺序或者时间等待来控制流程

 

3.异步如何控制执行顺序

3.1.回调

//iasyncresult,可用于监视调用进度

//dosomethinglong方法名称(要执行的操作)

 action<string> act = this.dosomethinglong;

 iasyncresult iasyncresult = null;

 asynccallback callback = ar =>

 {

    // console.writeline(object.referenceequals(ar, iasyncresult));

     console.writeline(ar.asyncstate);

     console.writeline($"这里是begininvoke调用完成之后才执行的。。。{thread.currentthread.managedthreadid.tostring("00")}");

 };

 iasyncresult = act.begininvoke("btnasync_click", callback, "异步学习");

3.2.等待

//iasyncresult.iscompeted确定异步调用何时完成(轮询)

action<string> act = this.dosomethinglong;

iasyncresult iasyncresult = act.begininvoke("btnasync_click", null, null);

int i = 1;

while (!iasyncresult.iscompleted)//1 卡界面,主线程在等待   2 边等待边做事儿  3有误差(时间)

{

    if (i < 10)

    {

        console.writeline($"文件上传{i++ * 10}%。。。请等待");

    }

    else

    {

        console.writeline("已完成99%。。。马上结束");

    }

    thread.sleep(200);//误差时间

}

console.writeline("文件上传成功!!!");

3.3.状态

//使用 iasyncresult.asyncwaithandle 获取 waithandle,使用它的 waitone 方法将执行一直阻塞到发出 //waithandle 信号,然后调用

action<string> act = this.dosomethinglong;

iasyncresult iasyncresult = act.begininvoke("btnasync_click", null, null);

//异步变同步(状态)

 iasyncresult.asyncwaithandle.waitone();//一直等待任务完成,第一时间进入下一行

iasyncresult.asyncwaithandle.waitone(-1);//一直等待任务完成,第一时间进入下一行

//最多等待1000ms,超时控制

iasyncresult.asyncwaithandle.waitone(1000);//最多等待1000ms,否则就进入下一行,可以做一些超时控制

//调用 begininvoke 后可随时调用 endinvoke 方法;如果异步调用未完成,endinvoke 将一直阻塞到

//异步调用完成。

act.endinvoke(iasyncresult);//等待

 

4.其他相关知识

任何的异步多线程,都是跟委托相关。委托中的invoke方法 是同步的。begininvoke开始一个异步的请求,调用线程池中一个线程来执行。

4.1.异步获取返回值

func<int, string> func = i => i.tostring();

iasyncresult iasyncresult = func.begininvoke(datetime.now.year, ar =>

 {

     string resultin = func.endinvoke(ar);//对于每个异步操作,只能调用一次 endinvoke。

     console.writeline($"this is {ar.asyncstate} 的异步调用结果 {resultin}");

 }, "异步参数");

//string result = func.endinvoke(iasyncresult);//获取返回值

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网