• net异步线程获取返回值的三种方式


    方式一:endInvoke

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        //调用异步方法,并返回值:
        //方式一,采用轮训的方式;
        //申明一个委托;
        public delegate int del(int a,int b);
        class Program
        {
            private static int add(int i, int j)
            {
                Console.WriteLine("starting task....");
                Thread.Sleep(2000);
                int result = i + j;
                return result;
    
            }
            static void Main(string[] args)
            {
                del d = new del(add);
                IAsyncResult re = d.BeginInvoke(10,12,null,null);
                while (!re.IsCompleted)
                {
                    Console.WriteLine("异步线程进行中....");
                }
                int result = d.EndInvoke(re);
                Console.WriteLine("result:"+result);
                Console.ReadLine();
    
            }
        }
    }

    方式二:回调函数

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        
       
        class Program
        {
            public delegate int del(int a,int b);
            static del d;
            static double result = 0; //使用全局的变量
    
            private static int add(int i, int j)
            {
                Console.WriteLine("starting task....");
                Thread.Sleep(2000);
                int result = i + j;
                return result;
    
            }
            private static void TaskFininshed(IAsyncResult ias)
            {
                result=d.EndInvoke(ias);
               
                Console.WriteLine("我来自异步线程...");
                Console.WriteLine("异步结束!输出结果");
                Console.WriteLine(result);
            }
            static void Main(string[] args)
            {
                 d= new del(add);
                IAsyncResult re = d.BeginInvoke(10,12,new AsyncCallback(TaskFininshed),null);
    
                Console.WriteLine("我来自主线程...."); 
                Console.WriteLine("这个时候,主线中的代码,不会被堵塞....");
    
                Console.ReadLine();//异步线程 是属于 后台线程,所以这里要阻止前台线程结束
            }
        }
    }

    waiteone的使用滴呀

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        
       
        class Program
        {
            public delegate int del(int a,int b);
            static del d;
            static double result = 0; //使用全局的变量
    
            private static int add(int i, int j)
            {
                Console.WriteLine("starting task....");
                Thread.Sleep(2000);
                int result = i + j;
                return result;
    
            }
            private static void TaskFininshed(IAsyncResult ias)
            {
                result=d.EndInvoke(ias);
               
                Console.WriteLine("我来自异步线程...");
                Console.WriteLine("异步结束!输出结果");
                Console.WriteLine(result);
            }
            static void Main(string[] args)
            {
                 d= new del(add);
                IAsyncResult re = d.BeginInvoke(10,12,new AsyncCallback(TaskFininshed),null);
    
                Console.WriteLine("我来自主线程...."); 
                Console.WriteLine("这个时候,主线中的代码,不会被堵塞....");
    
                //Console.ReadLine();//异步线程 是属于 后台线程,所以这里要阻止前台线程结束
                //这里我们不一定要使用  Console.ReadLine() 来等待异步线程的结束;
    
                //我们还可以 使用:
                while (!re.AsyncWaitHandle.WaitOne(1000,false))
                {
                    Console.WriteLine("主线程,在指定的时间内等你回来呀,亲....");
                    //如果指定时间为0,表示不等待,如果为-1,表示永远等待
    
                }
    
                Console.WriteLine("同步 异步 都结束了....");
                Console.ReadLine();
    
                /*
                 * 
                 * 
                 *  WaitOne的第一个参数表示要等待的毫秒数,
                 * 在指定时间之内,WaitOne方法将一直等待,直到异步调用完成,
                 * 并发出通知,WaitOne方法才返回true。
                 * 当等待指定时间之后,异步调用仍未完成,WaitOne方法返回false,
                 * 如果指定时间为0,表示不等待,如果为-1,表示永远等待,直到异步调用完成。
                 * 
                 * */
            }
        }
    }

    再看当waitone的时间设置不一样时候的结果;

  • 相关阅读:
    PHP+MYSQL单例模式的滑铁卢
    碰到一个安装SQl2008 Express Edition出错的怪异情况
    用虚拟并口解决向USB条码打印机发送ZPL指令的解决方案
    让excanvas支持动态创建的canvas标签(附演示文件)
    sql 检索语句
    c++ string 类基本用法样例
    Sqlite c/c++ api 学习
    最常见的20种VC++编译错误信息
    C#动态调用C++编写的DLL函数
    C++中将BYTE转16进制字符串
  • 原文地址:https://www.cnblogs.com/mc67/p/5623698.html
Copyright © 2020-2023  润新知