同步异步认识及异步方法使用

同步方法:多个任务一个一个执行,同一时刻系统中只有一个任务在执行
异步方法:发起一个调用,并不等着计算结束,而是直接去运行下一行;刚才的计算,会启动一个新的线程去执行

异步同步比较
1 同步方法卡界面,因为UI线程忙于计算;异步多线程方法不卡界面,主线程闲置,计算任务交给子线程在做;
2 同步方法慢,只有一个线程计算;异步多线程方法快,多个线程并发计算;
  多线程的资源消耗更多,线程并不是越多越好(资源有限/管理线程也消耗资源)
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, "kkk");


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、状态

//使用 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);//等待

异步获取返回值

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);//获取返回值
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值