zoukankan      html  css  js  c++  java
  • 异步多线程

    控制异步多线程顺序的一些方式

    1.异步回调,当线程结束时触发回调函数,用于线程结束时的操作(日志打印等)

    Console.WriteLine();
                Console.WriteLine("*********btnAsyncAdvance_Click 异步方法 start {0}********",Thread.CurrentThread.ManagedThreadId);
                Action<string> action = this.DoSomeThingLong;
                //action.Invoke("btnAsyncAdvance_Click_1");
    
                #region 异步回调
                //            AsyncCallback callback = ar =>
                //            {
                //                Console.WriteLine(ar.AsyncState);
                //                Console.WriteLine("这波操作已经完成 {0}",         Thread.CurrentThread.ManagedThreadId);
                //            };
                //            action.BeginInvoke("btnAsyncAdvance_Click", callback, "april");
                //            
                #endregion                

    2.IsCompleted完成等待,主线程需等待异步线程执行完成再运行的情况,等待时会出现延时的问题

            Console.WriteLine();
                Console.WriteLine("*********btnAsyncAdvance_Click 异步方法 start {0}********",Thread.CurrentThread.ManagedThreadId);
                Action<string> action = this.DoSomeThingLong;
    //用户必须确定操作完成,才能返回----上传文件,
                //只有成功之后才能预览---需要等到计算任务完成才能给用户返回
                //一方面文件上传,完成后才能预览;另一方面,由进度提示----只有主线程才能擦偶哦界面;
    
                //            IAsyncResult asyncResult = action.BeginInvoke("文件上传", null, null);
                //            int i = 0;
                //            while (!asyncResult.IsCompleted)
                //            {
                //                if (i < 9)
                //                {
                //                    this.ShowConsoleAndView($"当前文件上传进度为{++i * 10}%");
                //                }
                //                else
                //                {
                //                    this.ShowConsoleAndView($"当前文件上传进度为99.999%");
                //                }
                //                Thread.Sleep(100);
                //            }
                //
                //            Console.WriteLine("完成文件预览,绑定到界面");

    3.信号量,解决等待时的延时问题

     //                  IAsyncResult asyncResult = action.BeginInvoke("调用接口",null,null);
                //            Console.WriteLine("做一些别的操作,");
                //            Console.WriteLine("做一些别的操作,");
                //            Console.WriteLine("做一些别的操作,等调用接口一起做完,再往下走");
                //            asyncResult.AsyncWaitHandle.WaitOne(-1);//阻塞当前线程,直到收到一个信号,参数为-1表示一直等待
                //                                                  //1500表示最多等待1500ms超过就超时,不继续等待
                //            Console.WriteLine("调用接口成功,必须是真实的成功");

    4.EndInvoke,基于信号量等待,并获取返回值

      #region EndInvoke
                //调用接口,需要返回值
                Func<int> func = () => {
                    long lResult = 0;
                    for (int i = 0; i < 1000000000; i++)
                    {
                        lResult += i;
                    }
                    return DateTime.Now.Day; };
                IAsyncResult asyncResult = func.BeginInvoke(null, null);
                int iResult = func.EndInvoke(asyncResult);//如果向获取异步调用的真实返回值,只能用EndInvoke
                Console.WriteLine(iResult);
    
                #endregion

    1

  • 相关阅读:
    layout_alignStar 与 android:layout_alignEnd
    Java学习过程中的一些知识点
    L1-054 福到了->团体程序设计天梯赛-练习集
    JS冒号的作用
    JS中(function(){xxx})(); 这种写法是什么意思?
    去除vue上方的60px空白
    vue-cli · Failed to download repo vuejs-templates/webpaack: Response code 404
    Windows 7 MBR的修复与Linux产品正确卸载
    折腾一天安装Centos7,以及后面恢复Win7引导的曲折历程
    Windows 7硬盘安装CentOS 6.4 双系统 (WIN7下硬盘安装Linux(Fedora 16,CentOS 6.2,Ubuntu 12.04))
  • 原文地址:https://www.cnblogs.com/Manuel/p/13425961.html
Copyright © 2011-2022 走看看